Netty重写SimpleChannelInboundHandler后的ChannelRead0方法从未被调用?
public class RequestHandler extends SimpleChannelInboundHandler<MessageProtocol<MessageRequest>> {@Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageProtocol<MessageRequest> protocol) throws Exception {// 请求过来这里的代码从未被调用// 业务代码....}}
// ..........childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) { socketChannel.pipeline() // 协议编码 .addLast(new StringEncoder()) // 协议解码 .addLast(new StringDecoder()) // 请求处理器 .addLast(new RequestHandler()); } }).childOption(ChannelOption.SO_KEEPALIVE, true);// .........
希望结果:重写后的方法【RpcRequestHandler#channelRead0】每次有新请求都被调用
首先,我们需要确保RequestHandler
实例被正确添加到了ChannelPipeline
中。从你提供的代码片段来看,RequestHandler
实例被正确添加到了ChannelPipeline
中。
如果channelRead0
方法从未被调用,可能的原因有以下几点:
StringDecoder
解码。如果请求数据有问题,那么StringDecoder
可能无法正确解码请求,导致后续的处理器(包括你的RequestHandler
)不会被调用。ChannelPipeline
中,处理器的顺序很重要。确保你的处理器顺序是正确的,特别是解码器和编码器应该在你的处理器之前。在你的代码中,StringDecoder
在RequestHandler
之前,这是正确的。RequestHandler
实例没有被添加到ChannelPipeline
两次或者多次。如果一个ChannelHandler
已经被添加到了ChannelPipeline
,再次添加会导致之前的实例被覆盖。希望这些建议能帮助你解决问题。如果问题仍然存在,你可能需要提供更多的信息来帮助定位问题,例如请求数据、服务器日志、Netty版本等。
我有一个服务器-客户端应用程序不工作。这是代码:ChatServerHandler ChatServerInitializer 只是要提一下,其他一切都很好,信息只是没有收到。试图使用println在channelRead打印某些内容将不起作用。所以我知道它不会被打电话。另外,对不起,如果我不应该在这里发布整个代码,但我只是没有想法。
我正在使用Netty 4.1.0.final,但我面临一个问题,即消息不能通过出站处理程序传递。我发布了一个示例程序,其中有一个入站和一个出站处理程序。入站处理程序在ChannelHandlerContext中使用writeAndFlush,我的理解是它应该将消息转发到管道中可用的第一个出站处理程序。为了简单起见,忽略了内存管理。 引导代码 入站处理程序代码 } 出站处理程序代码 } 输出 信息T
我试图使用一个简单的服务器-客户端应用程序(代码见下文)进入Netty。 我在与两个问题作斗争: null KJ 这就是服务器的创建方式: 其中一个处理程序类(FeedbackServerHandler执行完全相同的操作,但解析为整数):
我已经用http://netty.io/wiki/user-guide-for-4.x.html链接但我得到的数据最多只有16384字节。 如何获取更多数据?
我不完全理解ByteBuf的写和读方法实际上是如何工作的。对这两种方法的详细解释将是非常好的。谢谢
我想创建一个可以重用通道的连接池,但我想不通 执行此测试 我在第二个频道遇到了ClosedChannel异常。写入(请求)。。。。 存在重用通道的方法吗?还是保持通道打开? 提前感谢