golang TCP/UDP

255 阅读1分钟

TCP/UDP简单实现(golang)

TCP服务器(并发版)

package main

import (
	"fmt"
	"net"
	"strings"
)

func HanderConnect(c net.Conn) {
	defer c.Close()

	fmt.Printf("c.RemoteAddr(): %v\n", c.RemoteAddr())
	fmt.Println("客户端成功连接")
	//循环读取客户端发送的数据
	buf := make([]byte, 4096)
	for {
		n, err := c.Read(buf)
		if n == 0 {
			fmt.Println("客户端关闭,断开连接!!")
			return
		}
		if err != nil {
			fmt.Printf("err: %v\n", err)
			return
		}
		fmt.Println("读到数据:", string(buf[:n]))

		//小写转大写,回写
		s := strings.ToUpper(string(buf[:n]))
		c.Write([]byte(s))
	}
}
func main() {
	l, err := net.Listen("tcp", "172.16.10.59:8001")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	defer l.Close()

	//监听请求

	for {
		fmt.Println("服务器等待连接")
		c, err := l.Accept()
		if err != nil {
			fmt.Printf("err: %v\n", err)
			return
		}
		go HanderConnect(c)
	}

}

TCP客户端(并发版)

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	c, err := net.Dial("tcp", "172.16.10.59:8001")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	defer c.Close()

	//获取用户键盘输入
	go func() {
		str := make([]byte, 4096)
		for {
			n, err := os.Stdin.Read(str)
			if err != nil {
				fmt.Printf("err: %v\n", err)
				continue
			}
			//写入服务器
			c.Write(str[:n])
		}
	}()
	//回显服务器回发的大写数据
	buf := make([]byte, 4096)
	for {
		n, err := c.Read(buf)
		if err != nil {
			fmt.Printf("err: %v\n", err)
			return
		}
		fmt.Println("客户端读到数据:", string(buf[0:n]))
	}
}

UDP服务端

package main

import (
	"fmt"
	"net"
	"time"
)

func main() {

	u, err := net.ResolveUDPAddr("udp", "172.16.10.59:8003")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	fmt.Println("服务器地址结构创建成功!!")
	udpConn, err := net.ListenUDP("udp", u)

	defer udpConn.Close()
	fmt.Println("udp服务创建成功!!!")
	buf := make([]byte, 4096)

	n, cltAddr, err := udpConn.ReadFromUDP(buf)
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	fmt.Println("服务器读到:", string(buf[0:n]))
	fmt.Printf("cltAddr: %v\n", cltAddr)
	daytime := time.Now().String()
	_, err = udpConn.WriteToUDP([]byte(daytime), cltAddr)
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
}

UDP客户端

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	c, err := net.Dial("udp", "172.16.10.59:8003")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	defer c.Close()

	//获取用户键盘输入
	go func() {
		str := make([]byte, 4096)
		for {
			n, err := os.Stdin.Read(str)
			if err != nil {
				fmt.Printf("err: %v\n", err)
				continue
			}
			//写入服务器
			c.Write(str[:n])
		}
	}()
	//回显服务器回发的大写数据
	buf := make([]byte, 4096)
	for {
		n, err := c.Read(buf)
		if err != nil {
			fmt.Printf("err: %v\n", err)
			return
		}
		fmt.Println("客户端读到数据:", string(buf[0:n]))
	}
}