首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netty,Strings和冲水

Netty,Strings和冲水
EN

Stack Overflow用户
提问于 2015-03-17 17:05:42
回答 1查看 360关注 0票数 0

我正在试验如何修改Netty代理的示例,使其修改一些正在进行中的内容。

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

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

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

代码语言:javascript
复制
ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

..。效果很好。

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

代码语言:javascript
复制
ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new LineBasedFrameDecoder(maxLen, false, false),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

到现在为止还好。但是如果我添加了一个字符串解码器,我会得到同样的挂起症状,这一次是因为StringDecoder之后的管道步骤没有被调用。

代码语言:javascript
复制
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在解码后处理字符串?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-18 03:27:43

StringEncoder是一个出站通道适配器。它的目的是在编写时将字符串转换为ByteBuf,因此我不希望在入站数据上调用编码。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29105342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档