我正在尝试编写一个相当简单的基于 Netty 的 TCP 代理(不是 HTTP - 任何基于 TCP 的协议)。本质上,给定
A -> proxy -> B
,我希望代理侦听来自 A 的传入连接,当一个到达时与 B 建立出站连接,然后在两个通道之间双向“传输”数据。
我在服务器端有一个处理程序,其中一个
channelActive
会在接受传入连接时启动到 B 的出站连接,还有一个 channelRead
会检查出站连接未来以确保出站连接正常在传递数据之前完成(尽管由于引用计数等原因,我不确定我是否正确)
我遇到的问题是我想要代理的协议之一的初始请求非常小,所以我看到以下内容:
我想监听未来出站连接的完成情况,并启动服务器端管道来处理已经缓冲的数据,但我不知道该怎么做。老实说,Netty 文档非常稀疏,并且 Handlers 和 Adapters 以及 AdaptorHandlers 和 HandlerAdaptors 很快就会变得非常混乱!
回答我自己的问题...
这里的关键是通道AUTO_READ的设置。一旦接受传入连接(服务器端的
channelActive
),请设置channel.config().setAutoRead(false)
。然后,一旦建立了出站连接(我使用附加到由 ConnectFuture
返回的 Bootstrap.connect(...)
的侦听器完成),我们可以在服务器端通道上重新启用自动读取,数据将开始流动。