写入通道的消息未进入管道

Message written to a channel not going into the pipeline

服务器和客户端都会发生这种情况。我有来自 channelActive 方法的 ChannelHandlerContext,我正在尝试使用 writeAndFlush(Object msg) 方法向它写入一个对象,但似乎 msg 从未进入创建的管道。

这是我的客户端处理程序的样子(我覆盖了数据包解码器和编码器中的一些方法进行调试)

public ChannelHandlerContext channel;
...
...
(method to start client is called)


EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
            b.group(workerGroup);
            b.channel(NioSocketChannel.class);
            b.option(ChannelOption.SO_KEEPALIVE, true);

b.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) {
                    ch.pipeline().addLast(
                            new PacketDecoder(clientRegistries){
                                @Override
                                protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
                                    List<Packet> packets = PacketHelper.handle(in, ctx, super.serverRegistries);
                                    packets.forEach(packet -> {
                                        System.out.println(packet.getClass());
                                    });
                                }

                                @Override
                                public void channelActive(ChannelHandlerContext ctx) throws Exception {
                                    channel = ctx;
                                    ctx.fireChannelActive();
                                }
                            },
                            new PacketEncoder(){
                                @Override
                                protected void encode(ChannelHandlerContext ctx, Pair<PacketRegistry, Packet> msg, ByteBuf out) throws Exception {
                                    System.out.println("message encoded on client sent to server");
                                    super.encode(ctx, msg, out);
                                }
                            }
                    );

                }
            });

ChannelFuture f = b.connect(host, port).sync();

这是我写入 ChannelHandlerContext 通道变量的方式


    public void sendPacket(PacketRegistry registry, Packet p) {
        System.out.println("data written to server from client");
        channel.writeAndFlush(new Pair<>(registry, p));
    }

当我 运行 我的代码时,“从客户端写入服务器的数据”是打印机,但从不打印“发送到服务器的客户端编码的消息”。

我想知道我做错了什么,任何帮助将不胜感激。如上所述,当我尝试使用 channelActive 方法中的 ChannelHandlerContext 进行编写时,服务器上也会发生同样的事情。

好的,我找到了答案,而且非常简单。 我没有使用 channelActive 方法(用于 udp),而是需要使用 channelRegistered 方法(用于 tcp)。