我正在试验如何修改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在解码后处理字符串?
发布于 2015-03-18 03:27:43
StringEncoder是一个出站通道适配器。它的目的是在编写时将字符串转换为ByteBuf,因此我不希望在入站数据上调用编码。
为了使代码工作,您需要用入站通道适配器替换StringEncoder,该适配器在读取时从字符串转换为ByteBuf。我怀疑Netty库中是否存在这样的编解码器,因为解码器通常从较低级别的格式转换到更高级别的格式,而不是反过来。
由于LineBasedFrameDecoder发出ByteBuf和HexDumpProxyFrontendHandler消耗ByteBufs,所以我建议您同时删除StringDecoder和StringEncoder并插入客户重写器。但是..。使其成为ByteBuf到ByteBuf解码器。在您的解码器中,您可以将传入的ByteBuf转换为字符串,完成您的工作,然后将其转换回ByteBuf,然后将其传递给管道。
https://stackoverflow.com/questions/29105342
复制相似问题