我正在嘗試編寫一個 TCP 客戶端,將 JSON RPC 發送到本地托管的 TCP 服務器。服務器應立即返回兩個答復。TCP 服務器托管在端口 60000 上。這是客戶端代碼的樣子:package mainimport ( "fmt" "log" "bufio" "net")func main() { d := net.Dialer{ } c, err := d.Dial("tcp", "127.0.0.1:60000") if err != nil { log.Println(err) return } data := `{"id": 1,"method":"mining.configure","params": [["version-rolling"],{"version-rolling.mask": "1fffe000","version-rolling.min-bit-count": 16}]}` fmt.Fprintf(c, data+"\n") for { message, _ := bufio.NewReader(c).ReadString('\n') fmt.Println(message) } }這就是我要發送的內容(“數據”變量){ "id": 1, "method":"mining.configure", "params": [["version-rolling"], {"version-rolling.mask": "1fffe000", "version-rolling.min-bit-count": 16}]}這是預期的回復:{"error":null,"id":1,"result":{"version-rolling":true,"version-rolling.mask":"1fffe000"}}{"id":null,"method":"mining.set_version_mask","params":["1fffe000"]}大多數時候,我只得到第一個響應(結果為“字段”),而沒有第二個具有“方法”字段的 JSON。有時我會兩者兼得。但這是通常的回答:{"error":null,"id":1,"result":{"version-rolling":true,"version-rolling.mask":"1fffe000"}}我知道當代碼變得像這樣不確定時,這是因為發生了異步問題。但是我遇到的每個新手教程都講授了這種用于編寫 TCP 客戶端的確切結構。它缺少什么?我已經使用帶有 Twisted 框架的 Python 對服務器進行了廣泛的相同 RPC 調用測試,并且我在 100% 的時間內都得到了回復。這使我確定問題出在我的客戶端代碼中,而不是服務器中。
1 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
根據接收數據的時間,對 ReadString 的調用可以緩沖\n. 問題中的代碼在循環的每次迭代中丟棄讀取器和讀取器中緩沖的數據。
為避免丟棄數據,創建讀取器一次并在循環內重復使用:
r := bufio.NewReader(c)
for {
message, _ := r.ReadString('\n')
fmt.Println(message)
}
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消