繁体   English   中英

净额,字符串和冲洗

[英]Netty, Strings and flushing

我正在尝试修改示例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));

到现在为止还挺好。 但是,如果添加String解码器,则会出现相同的挂起症状,这是因为未调用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解码后处理String?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM