我正在編寫一個(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ì)方的連接并寫入它?
golang中兩個(gè)不同tcp客戶端之間的中繼數(shù)據(jù)
長(zhǎng)風(fēng)秋雁
2023-06-26 18:04:33