我正在研究基于 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() 方法中的剩余数据并将其放回连接前面,以便可以正确读取。
任何见解都非常感谢。
动漫人物
相关分类