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

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

端木震博
2023-03-14

因此,服务器和客户端都发生这种情况。我有来自通道活动方法的通道处理程序上下文,我正在尝试使用写入AndFlush(对象消息)方法向其写入对象,但似乎消息永远不会进入创建的管道。

下面是我的客户端处理程序的样子(我重写了包解码器和编码器中的一些方法来调试)

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编写时,服务器上也会发生同样的事情。

共有1个答案

东方旭东
2023-03-14

好的,所以我找到了答案,它很简单。我需要使用channelRegistered方法(用于tcp)而不是channelActive方法(用于udp)。

 类似资料:
  • 问题内容: 我以为直到现在我都了解* nix管道…我有一个名为的可执行文件,它指向我的安装程序的符号链接,我以为我可以使用 但这是行不通的。它给我的效果等同于仅在当前目录中运行。 如果我跑步,我会得到。如果我运行,我得到的预期输出将显示符号链接位置。 那么,为什么管道版本不起作用?我还没为管道抱怨什么? 问题答案: 为此,您需要: 来自: xargs-从标准输入构建和执行命令行 要完全理解管道的工

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

  • 我有下面的代码从消息生成嵌入,它现在可以正常工作。我想要的是,在创建嵌入后,bot应该要求用户提到一个频道,在用户提到一个频道后,bot应该将该嵌入发送到那里。我该怎么做?

  • 基于我对Kinesis数据流的阅读,我必须创建一个分析应用程序,然后将用于调用一个lambda。然后,我将不得不使用lambda写入S3。或者Kinesis数据流可以以某种方式直接写入lambda?我找不到任何表明相同的东西。 消防水带不按小时收费(而溪流是)。那么消防水管对我来说是更好的选择吗?

  • 问题内容: 感谢以下有用的建议: 所以当我似乎固定 将命令分成对Popen的单独调用 stderr = subprocess.PIPE作为每个Popen链的参数。 新代码: 原始帖子: 我花了很长时间尝试解决通过简单的subprocess.Popen传递问题。 码: 输出文件的长度约为1000行: 文件长度大于241行的输出: 文件长度小于241行的输出很好。 我一直在疯狂地阅读文档并进行谷歌搜索

  • 我无法将数据从java发送到ProcessBuilder/Process创建的(linux)子进程。 仅基于shell的基本示例如下所示,效果良好。 现在,我想用一个java程序来代替,该程序应该在内部创建一个新的进程(即