java - Netty、字符串和冲洗

标签 java proxy netty

我正在尝试调整示例 Netty 代理,使其修改一些途中的内容。

我在 FTP 客户端和服务器之间进行代理,因此行以 CRLF 结尾——这很重要。我还没有对 FTP 数据端口做任何事情,所以这不是一个因素。

我从这个示例代码开始:https://netty.io/4.0/xref/io/netty/example/proxy/package-summary.html

...它设置了这样的管道:

ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

...效果很好。

如果我添加一个new LineBasedFrameDecoder(maxLen),ftp 客户端将挂起等待服务器,因为代理已剥离 CRLF,而服务器仍在等待。我可以通过告诉帧解码器不要删除分隔符来解决此问题:new LineBasedFrameDecoder(maxLen, false, false)

ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new LineBasedFrameDecoder(maxLen, false, false),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

到目前为止,一切都很好。但是,如果我添加一个字符串解码器,我会得到相同的挂起症状,这次是因为未调用 StringDecoder 之后的管道步骤。

ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new LineBasedFrameDecoder(maxLen, false, false),
      new StringDecoder(StandardCharsets.UTF_8),
      // aim is for my own string rewriter to go here
      new StringEncoder(StandardCharsets.UTF_8),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

在调试器中,StringEncoder.encode() 中的断点不会触发。

如何告诉 Netty 在解码后处理字符串?

最佳答案

StringEncoder 是出站 channel 适配器。它的目的是在写入时从 String 转换为 ByteBuf,因此我不希望对入站数据调用编码。

为了使您的代码正常工作,您需要将 StringEncoder 替换为入站 channel 适配器,该适配器在读取时从 String 转换为 ByteBuf。我怀疑 Netty 库中是否存在任何此类编解码器,因为解码器通常从较低级别的格式转换为较高级别的格式,而不是相反。

由于 LineBasedFrameDecoder 发出 ByteBuf 而 HexDumpProxyFrontendHandler 消耗 ByteBuf,我建议您删除 StringDecoder 和 StringEncoder 并插入您的客户重写器。但是..使其成为 ByteBuf 到 ByteBuf 解码器。在解码器中,您可以将传入的 ByteBuf 转换为字符串,完成您的工作,然后将其转换回 ByteBuf,然后将其传递到管道中。

关于java - Netty、字符串和冲洗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29105342/

相关文章:

java - addPrefencesFromResource 导致 ClassCastException

java - 对象序列化以某种方式初始化 hibernate 代理

c# - C# : HTTP 407 error 中的代理基本身份验证

java - 编译时出现一个或多个错误的NetBeans项目

java - 奇数货币值(value)的正则表达式

java - 声明为 Final 的经典变量是否包含与非 Final 变量不同的内存段?

tomcat - 具有多个 tomcat 实例的反向代理的 Nginx 配置

java - Netty 绑定(bind)到错误的接口(interface)

java - Netty 4.1 如何从服务器端重启 SSL session /握手(问候请求)

java - 如何获得 Activity 连接数?