我正在編寫一個 TCP 服務器,它同時接受來自移動設備和一些 WiFi 設備(IOT)的多個連接。連接一旦建立就需要維持,如果沒有收到心跳,則超時 30 秒。所以它類似于以下內容:// clientsMap map[string] connfunc 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中獲取對方的連接并寫入它?
1 回答

蝴蝶不菲
TA貢獻1810條經驗 獲得超4個贊
net.Conn 的文檔明確指出:
多個 goroutine 可以同時調用 Conn 上的方法。
所以是的,只需寫入連接就可以了。您應該注意對每條要發送的消息發出一次 Write 調用。如果您多次調用 Write,則可能會面臨來自不同移動設備的消息交錯的風險。這意味著直接調用 Write,而不是通過其他 API(換句話說,不包裝連接)。例如,以下內容是不安全的:
json.NewEncoder(conn).Encode(myValue)?//?use?json.Marshal(myValue)?instead io.Copy(conn,?src)????????????????????//?use?io.ReadAll(src)?instead
- 1 回答
- 0 關注
- 145 瀏覽
添加回答
舉報
0/150
提交
取消