亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang中兩個不同tcp客戶端之間的中繼數據

golang中兩個不同tcp客戶端之間的中繼數據

Go
長風秋雁 2023-06-26 18:04:33
我正在編寫一個 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


查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號