当前位置: 首页 > 知识库问答 >
问题:

netty - Netty重写SimpleChannelInboundHandler后的ChannelRead0方法从未被调用?

万俟心思
2023-12-26

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】每次有新请求都被调用

共有1个答案

胡弘毅
2023-12-26

首先,我们需要确保RequestHandler实例被正确添加到了ChannelPipeline中。从你提供的代码片段来看,RequestHandler实例被正确添加到了ChannelPipeline中。

如果channelRead0方法从未被调用,可能的原因有以下几点:

  1. 请求数据的问题:检查发送到服务器的请求数据是否正确,是否能够被StringDecoder解码。如果请求数据有问题,那么StringDecoder可能无法正确解码请求,导致后续的处理器(包括你的RequestHandler)不会被调用。
  2. 处理器顺序问题:在ChannelPipeline中,处理器的顺序很重要。确保你的处理器顺序是正确的,特别是解码器和编码器应该在你的处理器之前。在你的代码中,StringDecoderRequestHandler之前,这是正确的。
  3. ChannelHandler的状态:确保你的RequestHandler实例没有被添加到ChannelPipeline两次或者多次。如果一个ChannelHandler已经被添加到了ChannelPipeline,再次添加会导致之前的实例被覆盖。
  4. 异常处理:检查是否有任何异常在处理过程中被抛出。如果有异常,那么后续的处理器将不会被调用。
  5. Netty版本问题:确保你使用的Netty版本是最新的,或者至少是一个已知稳定的版本。有些旧版本的Netty可能存在已知的问题。
  6. 调试:你可以使用Netty的调试功能来检查请求和响应是否按照预期在各个处理器之间传递。你可以在启动服务器时添加一些调试参数来启用这个功能。

希望这些建议能帮助你解决问题。如果问题仍然存在,你可能需要提供更多的信息来帮助定位问题,例如请求数据、服务器日志、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异常。写入(请求)。。。。 存在重用通道的方法吗?还是保持通道打开? 提前感谢