如何编写 Netty TCP 代理(在两个通道之间传输数据)

问题描述 投票:0回答:1

我正在尝试编写一个相当简单的基于 Netty 的 TCP 代理(不是 HTTP - 任何基于 TCP 的协议)。本质上,给定

A -> proxy -> B
,我希望代理侦听来自 A 的传入连接,当一个到达时与 B 建立出站连接,然后在两个通道之间双向“传输”数据。

我在服务器端有一个处理程序,其中一个

channelActive
会在接受传入连接时启动到 B 的出站连接,还有一个
channelRead
会检查出站连接未来以确保出站连接正常在传递数据之前完成(尽管由于引用计数等原因,我不确定我是否正确)

我遇到的问题是我想要代理的协议之一的初始请求非常小,所以我看到以下内容:

  1. 入站连接
  2. 发起出站连接
  3. 接收微小的二进制请求(4字节)
  4. 不执行任何操作,因为出站连接未完成
  5. 出站连接完成
  6. ...什么都没有...因为没有更多数据可供读取,这 4 个字节只是缓冲在某处

我想监听未来出站连接的完成情况,并启动服务器端管道来处理已经缓冲的数据,但我不知道该怎么做。老实说,Netty 文档非常稀疏,并且 Handlers 和 Adapters 以及 AdaptorHandlers 和 HandlerAdaptors 很快就会变得非常混乱!

netty
1个回答
0
投票

回答我自己的问题...

这里的关键是通道AUTO_READ的设置。一旦接受传入连接(服务器端的

channelActive
),请设置
channel.config().setAutoRead(false)
。然后,一旦建立了出站连接(我使用附加到由
ConnectFuture
返回的
Bootstrap.connect(...)
的侦听器完成),我们可以在服务器端通道上重新启用自动读取,数据将开始流动。

© www.soinside.com 2019 - 2024. All rights reserved.