为了账号安全,请及时绑定邮箱和手机立即绑定

Go - TCP 客户端经常错过辅助 JSON 回复

Go - TCP 客户端经常错过辅助 JSON 回复

Go
holdtom 2022-12-19 21:16:58
我正在尝试编写一个 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)

}   


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号