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

如何使用 json.Decoder 解码单个 json 消息并将连接切换到不同的协议?

如何使用 json.Decoder 解码单个 json 消息并将连接切换到不同的协议?

Go
RISEBY 2021-09-10 18:17:26
我正在研究基于 TCP 的代理,该代理必须首先在给定连接上的 json 中执行 REQ/REPLY 握手。因为 JSON 是一种自定界协议,所以我使用 Go 的 json.Decoder 来完成这项工作,这很好地完成了这项工作。以下是我采取的步骤:拨号连接到远程服务器将单个 json 请求写入远程服务器 (REQ)从同一个远程服务器读取单个 json 回复(完成代理握手 REPLY)在有效的 json 握手后,将客户端连接传递到代码的另一部分,从现在开始,该部分将(向前)切换到基于文本的协议。问题是,当 json.Decoder 将数据读入其内部缓冲区时,它可能会读取比它需要的更多的数据,在这种情况下,json.Decoder 有一个 Buffered()方法,该方法将剩余数据返回给 io.Reader。此数据(在 Buffered() 方法中可用)现在是基于文本的协议数据,需要在 json 握手完成其工作后从连接中读取。但是,如果我按原样传递连接而不考虑剩余的缓冲区,连接将进入锁定状态,因为它正在等待读取这个永远不会到来的数据。处理基于文本的协议的代码需要一个net.Conn前进,一旦我向前传递连接(在进行 json 握手之后),利用该连接的代码此时就知道如何使用基于文本的协议在。所以应该有明确的工作边界。我的问题是解决这个问题的理想方法是什么,这样我仍然可以利用 json.Decoder,但确保当我将连接传递到我的代理中代码的不同部分时,我知道数据的开始基于文本的协议仍然可读。我以某种方式需要获取 json.Decoder 的 Buffered() 方法中的剩余数据并将其放回连接前面,以便可以正确读取。任何见解都非常感谢。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞


你可以试试


type ConnWithBuffIncluded struct{ //Implement net.Conn so can be passed through pipeline

    net.Conn

    json.Decoder

}


func (x ConnWithBuffIncluded) Read(p []byte) (n int, err error){ //Will Read both sources

    return io.MultiReader(x.Decoder.Buffered(), x.Conn).Read(p)

}


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信