在golang中的两个不同tcp客户端之间中继数据

在golang中的两个不同tcp客户端之间中继数据,go,tcplistener,Go,Tcplistener,我正在编写一个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,

我正在编写一个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在等待挂起的读取时被阻塞,我如何使它也等待来自通道的数据?或者我应该从客户地图上获取另一方的连接并写信给它吗?

明确指出:

多个goroutine可以同时调用Conn上的方法

因此,是的,只需向连接写入即可。您应该注意为要发送的每封邮件发出一个写呼叫。如果您多次呼叫或写入,则可能会将来自不同移动设备的消息交错发送。这意味着直接调用Write,而不是通过其他API(换句话说,不要包装连接)。例如,以下情况不安全:


为每个连接启动读写goroutine。有关示例,请参见。该示例使用WebSocket,但可以轻松转换为使用TCP。相关:
json.NewEncoder(conn).Encode(myValue) // use json.Marshal(myValue) instead
io.Copy(conn, src)                    // use io.ReadAll(src) instead