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

Netty出站处理程序未被调用

冉弘化
2023-03-14

我正在使用Netty 4.1.0.final,但我面临一个问题,即消息不能通过出站处理程序传递。我发布了一个示例程序,其中有一个入站和一个出站处理程序。入站处理程序在ChannelHandlerContext中使用writeAndFlush,我的理解是它应该将消息转发到管道中可用的第一个出站处理程序。为了简单起见,忽略了内存管理。

引导代码

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .localAddress(12021)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 protected void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new TestHandler1(), new TestOutHandler1());
                 }
             });
ChannelFuture future = bootstrap.bind().sync();
System.out.println("Server Started...");
    future.channel().closeFuture().sync();
    bossGroup.shutdownGracefully();
    workerGroup.shutdownGracefully();
    System.out.println("Server Shutdown");

入站处理程序代码

public class TestHandler1 extends ChannelInboundHandlerAdapter {


private static Log logger = LogFactory.getLog(TestHandler1.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    logger.info("channelRead");
    ctx.writeAndFlush(msg);
}

}

出站处理程序代码

public class TestOutHandler1 extends ChannelOutboundHandlerAdapter {

private static Log logger = LogFactory.getLog(TestOutHandler1.class);

@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
    logger.info("write");
    ctx.writeAndFlush(msg);
}

}

输出

信息TestHandler1:channelRead

如果我在channel上执行writeAndFlush()而不是ChannelHandlerContext来更改入站处理程序(如下所示),我将得到预期的输出

修改的入站汉德勒

public class TestHandler1 extends ChannelInboundHandlerAdapter {

private static Log logger = LogFactory.getLog(TestHandler1.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    logger.info("channelRead");
    ctx.channel().writeAndFlush(msg);
}

}

输出

信息TestHandler1:channelRead

INFO TestOutHandler1:写入

根据Norman在下面链接中的解释,我理解为ChannelHandlerContext.Write(...)应该通过它前面的ChannelOutboundHandlers,在我的示例中,它是唯一的出站处理程序。

诺曼解释

如果我的理解是错误的,或者我遗漏了什么,请告诉我。

共有1个答案

仲孙兴旺
2023-03-14

前面的回答很好,我想解释一下问题的另一个方面:调用CTX.WriteAndFlush()CTX.Channel.WriteAndFlush()得到的不同结果

  1. CTX.WriteAndFlush()
    查找当前CTX之前的第一个OutboundHandler。在你的频道里,什么也找不到。因此只打印一个信息。
  2. ctx.channel.writeandflush()
    实际上,ctx.channel.writeandflush()将调用pipeline.tail.writeandflush()。这等于在您的通道中的尾部ctx上调用writeandflush()。这样,将找到TestOutHandler1,并调用TestOutHandler1.write()。然后打印两个信息。
 类似资料:
  • 我试图使用一个简单的服务器-客户端应用程序(代码见下文)进入Netty。 我在与两个问题作斗争: null KJ 这就是服务器的创建方式: 其中一个处理程序类(FeedbackServerHandler执行完全相同的操作,但解析为整数):

  • 我有一个UITableView,在委托(视图控制器)中,我已经实现了该函数 然后,我测试编辑样式 作为删除的一部分,我请求用户确认,如果他们选择“是”,与该行相关的项目将被删除,如果他们选择“否”,我将重置编辑样式。 我似乎遇到的问题是没有调用任何完成处理程序。我在其他地方使用过这种格式,没有任何问题。 该警报将显示标题、消息以及按钮“取消”和“是”。如果我点击其中任何一个,什么都不会发生。警报被

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 我正在学习Netty并制作一个通过TCP发送对象的简单应用程序的原型。我的问题是,当我用我的消息从服务器端调用时,它似乎没有到达管道中的处理程序。当我从客户端向服务器发送消息时,它按预期工作。 这是代码。 服务器: 双工通道处理程序: 最后是编码器(解码器类似): 客户端: 和处理程序: 当我通过服务器端的控制台发送消息时,我得到了输出: 因此,看起来似乎在客户端发送了消息,但没有收到任何消息。

  • 我有这个单声道代码: 当validate方法抛出ValidationException时,将同时调用handleValidation异常和handleException。我只希望调用handleValidationException。为什么会发生这种情况?如何防止handleException被调用?

  • 我正在为Spring MVC中的异常处理开发示例演示应用程序。我正在尝试使用@ControllerAdvice处理异常 我遵循了本链接中描述的步骤。 但是当我运行我的应用程序时,我得到了以下错误 以下是我正在学习的课程 应用程序异常。JAVA 控制器类 ApplicationExceptionController。JAVA 下面是GlobalExceptionHandler类 GlobalExce