【Golang】网络开发:UDP

UDP

UDP就比较简单了,因为UDP是有消息边界的,所以不需要处理粘包,只需要关心怎么收数据发数据即可

net包

UDP相关函数在net包中有专门分类

type UDPConn struct {
    // 内含隐藏或非导出字段
}

客户端使用func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error)

服务端使用func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error)

服务端

func UdpServer() {
	listen, err := net.ListenUDP("udp", &net.UDPAddr{
		IP:   net.IPv4(0, 0, 0, 0),
		Port: 30000,
	})
	if err != nil {
		fmt.Println("listen failed, err:", err)
		return
	}
	defer listen.Close()
	for {
		var data [1024]byte
		n, addr, err := listen.ReadFromUDP(data[:]) // 接收数据
		if err != nil {
			fmt.Println("read udp failed, err:", err)
			continue
		}
		fmt.Printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)
		_, err = listen.WriteToUDP(data[:n], addr) // 发送数据
		if err != nil {
			fmt.Println("write to udp failed, err:", err)
			continue
		}
	}
}

客户端

func TcpClient(address string) {
	var cname string
	conn, err := net.Dial("tcp", address) // 创建一个连接用的客户端
	if err != nil {
		log.Println("err :", err)
		return
	} else {
		cname = strconv.Itoa(int(time.Now().Unix()))
		log.Println("创建客户端完成,当前客户端名:", cname)
		msg, err := Encode(cname + ": 我走了")
		if err != nil {
			fmt.Println("转码失败")
		}
		defer func() {
			_, _ = conn.Write(msg)
			err := conn.Close() // 关闭连接
			if err != nil {
				log.Println("关闭连接失败:", err)
			} else {
				log.Println("退出了")
			}
		}()
	}
	inputReader := bufio.NewReader(os.Stdin) // 创建一个命令行输入的缓冲读取器
	for {
		log.Println("等待新的指令")
		input, _ := inputReader.ReadString('\n') // 读取用户输入
		inputInfo := strings.Trim(input, "\r\n")
		if strings.ToLower(inputInfo) == "exit" { // 输入exit退出
			return
		}
		for i := 0; i < 10; i++ {
			msg,_ := Encode(cname + ": " + inputInfo)
			_, err = conn.Write(msg) // 发送数据
		}
		if err != nil {
			return
		} else {
			log.Println("已发送:", inputInfo)
		}
		log.Println("开始阻塞等待服务端返回数据")
		reader := bufio.NewReader(conn)
		msg, err := Decode(reader)
		if err != nil {
			log.Println("获取数据失败:", err)
			return
		} else {
			log.Println("已发送:", msg)
		}
	}
}

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论