猿问

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

我正在研究基于 TCP 的代理,该代理必须首先在给定连接上的 json 中执行 REQ/REPLY 握手。因为 JSON 是一种自定界协议,所以我使用 Go 的 json.Decoder 来完成这项工作,这很好地完成了这项工作。

以下是我采取的步骤:

  1. 拨号连接到远程服务器

  2. 将单个 json 请求写入远程服务器 (REQ)

  3. 从同一个远程服务器读取单个 json 回复(完成代理握手 REPLY)

  4. 在有效的 json 握手后,将客户端连接传递到代码的另一部分,从现在开始,该部分将(向前)切换到基于文本的协议。

问题是,当 json.Decoder 将数据读入其内部缓冲区时,它可能读取比它需要的更多的数据,在这种情况下,json.Decoder 有一个 Buffered()方法,该方法将剩余数据返回给 io.Reader。

此数据(在 Buffered() 方法中可用)现在是基于文本的协议数据,需要在 json 握手完成其工作后从连接中读取。但是,如果我按原样传递连接而不考虑剩余的缓冲区,连接将进入锁定状态,因为它正在等待读取这个永远不会到来的数据。处理基于文本的协议的代码需要一个net.Conn前进,一旦我向前传递连接(在进行 json 握手之后),利用该连接的代码此时就知道如何使用基于文本的协议在。所以应该有明确的工作边界。

我的问题是解决这个问题的理想方法是什么,这样我仍然可以利用 json.Decoder,但确保当我将连接传递到我的代理中代码的不同部分时,我知道数据的开始基于文本的协议仍然可读。我以某种方式需要获取 json.Decoder 的 Buffered() 方法中的剩余数据并将其放回连接前面,以便可以正确读取。

任何见解都非常感谢。


RISEBY
浏览 172回答 1
1回答

动漫人物

你可以试试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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答