go - 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)
}
解决方案
服务器应该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/
推荐阅读
- java - 尝试使用 Spring 编译时包不存在
- php - 运行安装部分 beanbooks 时出现 PHP/kohana 错误
- java - 通过 Twitter API 发布回复时获取无法验证 32
- ios - CORDOVA IOS - 我构建时被拒绝的错误承诺
- git - 当人们对 git 说“祖先”时,他们是什么意思?
- php - 使用插入查询 CI PHP Mysql Ajax
- c - BST后序遍历中的打印深度
- ubuntu - ffmpeg 循环不工作在第一次循环后不断丢帧
- python-3.x - 如何在 Python 3x 中将字符串列表转换为整数列表
- keras - Keras 中 LSTM 的不同 time_step 输入