首页 > 解决方案 > go中如何与UDP服务器中的多个客户端通信?

问题描述

我有一台通过 UDP 传输文件的服务器,它在只有一个客户端时运行良好,但如果其他客户端尝试连接,则会引发以下错误

listen udp :20000: bind:每个套接字地址(协议/网络地址/端口)通常只允许使用一次。

这是我的主要代码:

...
fmt.Println("Input the number of connections")
var number int
fmt.Scanln(&number)

var wg sync.WaitGroup
wg.Add(number)

lAdd, err := net.ResolveUDPAddr("udp", PORT)
if err != nil {
    fmt.Println(err)
    return
}

for i:=0; i < number; i++ {
    go startConnection(lAdd, file, i, wg)
}
wg.Wait()

这是 startConnection 的代码:

func startConnection (lAdd * net.UDPAddr, archivo string, i int, wg sync.WaitGroup) {

defer wg.Done()

conn, err := net.ListenUDP("udp", lAdd)
if err != nil {
    logger.Println("There was an error: ", err)
    return
}

defer conn.Close()

sendFile (conn, add, archivo, i)
}

标签: goudp

解决方案


服务器应该Listen只调用一次来启动监听器。那时,它正在倾听。由于协议的性质,这就是 TCP 和 UDP 不同的地方。

ListenTCP返回 a TCPListener,可用于Accept连接进来。然后每个连接都可以发送和接收数据。

ListenUDP返回 a UDPConn,与 相同DialUDP,因为 UDP 是无连接协议。您只需读取和写入UDPConn. UDP 数据包头包括源和目标信息,因此您可以使用它ReadFrom来读取数据并查看是谁发送的,并WriteTo响应特定的客户端。

这篇文章对在 Go 中实现 UDP 连接进行了非常彻底的概述:https ://ops.tips/blog/udp-client-and-server-in-go/


推荐阅读