我正在研究基于 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)
}
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消