第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

golang中兩個(gè)不同tcp客戶端之間的中繼數(shù)據(jù)

golang中兩個(gè)不同tcp客戶端之間的中繼數(shù)據(jù)

Go
長(zhǎng)風(fēng)秋雁 2023-06-26 18:04:33
我正在編寫一個(gè) TCP 服務(wù)器,它同時(shí)接受來自移動(dòng)設(shè)備和一些 WiFi 設(shè)備(IOT)的多個(gè)連接。連接一旦建立就需要維持,如果沒有收到心跳,則超時(shí) 30 秒。所以它類似于以下內(nèi)容:// 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    }}所以每個(gè)客戶端都有一個(gè) goroutine。每個(gè)客戶端一旦連接到服務(wù)器,就會(huì)等待讀取。然后服務(wù)器處理讀取的內(nèi)容。問題是我有時(shí)需要從一個(gè)客戶端讀取數(shù)據(jù),然后將數(shù)據(jù)傳遞到另一個(gè)客戶端(在移動(dòng)設(shè)備和 WiFi 設(shè)備之間)。我已將連接存儲(chǔ)在clientsMap. 所以我可以隨時(shí)訪問它。但是由于每個(gè)客戶端都由一個(gè) goroutine 處理,我是否應(yīng)該使用通道將數(shù)據(jù)從一個(gè)客戶端傳遞到另一個(gè)客戶端?但是如果 goroutine 被阻塞等待掛起的讀取,我如何讓它也等待來自通道的數(shù)據(jù)?或者我應(yīng)該從clientsMap中獲取對(duì)方的連接并寫入它?
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

net.Conn 的文檔明確指出:

多個(gè) goroutine 可以同時(shí)調(diào)用 Conn 上的方法。

所以是的,只需寫入連接就可以了。您應(yīng)該注意對(duì)每條要發(fā)送的消息發(fā)出一次 Write 調(diào)用。如果您多次調(diào)用 Write,則可能會(huì)面臨來自不同移動(dòng)設(shè)備的消息交錯(cuò)的風(fēng)險(xiǎn)。這意味著直接調(diào)用 Write,而不是通過其他 API(換句話說,不包裝連接)。例如,以下內(nèi)容是不安全的:

json.NewEncoder(conn).Encode(myValue)?//?use?json.Marshal(myValue)?instead
io.Copy(conn,?src)????????????????????//?use?io.ReadAll(src)?instead


查看完整回答
反對(duì) 回復(fù) 2023-06-26
  • 1 回答
  • 0 關(guān)注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)