go udp服务端

本文主要介绍了如何在服务端使用UDP协议进行数据收发,包括使用`net.ListenPacket`监听包,以及处理并发请求的方法。同时展示了客户端如何通过`SendUDPRequest`函数发送请求并接收响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络协议
常见的:tcp ,udp,http ,ftp

在这里插入图片描述

在这里插入图片描述无连接所以传输快,一般硬件传输都用udp

1 以下这俩都能用,服务端代码

pc, err := net.ListenPacket("udp", ":8080")
	fmt.Printf("%T\n", pc)// 打印pc返回格式
	//return
	if err != nil {
		panic(err)
	}
	defer pc.Close()//延迟关闭链接

	for {
		buf := make([]byte, 1024)//创建一个切片buf
		_, addr, err := pc.ReadFrom(buf)//读取udp返回内容
		//出现错误不执行go
		if err != nil {
			continue
		}
		go func() {

			if err != nil {
				log.Println("Failed to read from connection:", err)
			}

			log.Printf("Received data from %s: %s", addr.String(), string(buf))

			if _, err := pc.WriteTo([]byte("Hello from server!"), addr); err != nil {
			//打印内容
				log.Println("Failed to write to connection:", err)
			}

		}()

	}
	return

2

PoolSizeUDP := 1472
	listener, err := net.ListenUDP("udp", &net.UDPAddr{
		IP:   net.ParseIP("127.0.0.1"),
		Port: 8080,
	})
	if err != nil {
		return
	}
	// 如果还不行,考虑把系统的buffer设大一点
	// listener.SetReadBuffer(1024 * 1024 * 8)
	// listener.SetWriteBuffer(1024 * 1024 * 8)
	var data = make([]byte, PoolSizeUDP)
	//chLimit := make(chan int, 5) // 最多创建64个协程,避免内存爆炸
	for {
		n, _, err := listener.ReadFromUDP(data)
		if err != nil {
			continue
		}
		raw := make([]byte, n) // 重点注意,每次循环都必须创建新的raw变量,否则踩内存
		copy(raw, data[:n])
		//chLimit <- 1
	
		go func(udpMsg []byte) {
			// 拿 udpMsg 做点什么
			fmt.Println(string(udpMsg))
		}(raw)
	}

客户端请求

func main() {
	var data = "123"
	var ip = "127.0.0.1"
	var port = "8080"
	r, _ := comm.SendUDPRequest([]byte(data), ip, port)

	fmt.Println(string(r))
}


// SendUDPRequest
//
//	@Description:发送UDP请求
//	@param data
//	@param ip
//	@param port
//	@return []byte
//	@return error
func SendUDPRequest(data []byte, ip string, port string) ([]byte, error) {
	if ip == "" {
		ip = config.LhyEasyIP
	}
	if port == "" {
		port = config.LampServ["port"]
	}
	client, err := net.Dial("udp", ip+":"+port)
	if err != nil {
		return nil, err
	}
	defer client.Close()
	_, err = client.Write(data)
	if err != nil {
		return nil, err
	}
	buffer := make([]byte, 1024)
	n, err := client.Read(buffer)
	if err != nil {
		return nil, err
	}
	return buffer[:n], nil
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值