我正在编写一个 TCP 服务器,它同时接受来自移动设备和一些 WiFi 设备(IOT)的多个连接。连接一旦建立就需要维持,如果没有收到心跳,则超时 30 秒。所以它类似于以下内容:
// clientsMap map[string] conn
func someFunction() {
conn, err := s.listener.Accept()
// I store the conn in clientsMap
// so I can access it, for brevity not
// shown here, then:
go serve(connn)
}
func serve(conn net.Conn) {
timeoutDuration := 30 * time.Second
conn.SetReadDeadline(time.Now().Add(timeoutDuration))
for {
msgBuffer := make([]byte, 2048)
msgBufferLen, err := conn.Read(msgBuffer)
// do something with the stuff
}
}
所以每个客户端都有一个 goroutine。每个客户端一旦连接到服务器,就会等待读取。然后服务器处理读取的内容。
问题是我有时需要从一个客户端读取数据,然后将数据传递到另一个客户端(在移动设备和 WiFi 设备之间)。我已将连接存储在clientsMap. 所以我可以随时访问它。但是由于每个客户端都由一个 goroutine 处理,我是否应该使用通道将数据从一个客户端传递到另一个客户端?但是如果 goroutine 被阻塞等待挂起的读取,我如何让它也等待来自通道的数据?或者我应该从clientsMap中获取对方的连接并写入它?
蝴蝶不菲
相关分类