【问题标题】:Netty channel.write not writing messageNetty channel.write 不写消息
【发布时间】:2014-11-03 19:51:44
【问题描述】:

我正在尝试使用 Netty 迈出第一步,为此我在 Netty 上编写了简单的服务器,在 oio 普通 TCP 上编写了简单的客户端。

客户端发送随机文本包,并且必须收到“Ack”消息。 查看处理方法:

  @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

    ctx.write("Ack"); 
    ctx.flush();

    ByteBuf in = (ByteBuf) msg;
    StringBuilder sb = new StringBuilder();
    try {
        while (in.isReadable()) {
            sb.append((char) in.readByte());

        }
    } finally {
        ReferenceCountUtil.release(msg);
    }
    LOG.debug("Incoming message. ACK was send");

    String myaddr = ctx.channel().remoteAddress().toString();
    String message = "Message from " + myaddr + " :" + sb.toString();
    LOG.debug(message);
    sendToOther(myaddr, message);

}

问题是 - 当我尝试发回“Ack”字符串时 - 客户端什么也没收到。 但是当我尝试发回传入的消息时 - 它工作正常,我在我的客户端看到回声。

 @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

    ctx.write(msg); 
    ctx.flush();

write() 方法需要Object,我尝试发送(Object) String - 但什么也没发生。 我也尝试发送ByteBuf(我在一篇文章中看到),但它仍然无法正常工作。

当我将传入消息作为回声发回时 - 它可以工作。当我发送其他东西时 - 它没有。请帮帮我,我只是想不出我的错误在哪里。


我解决了这个问题。重点是,您只需要发送ByteBuff。所以我们需要创建它,然后给它写一些东西,然后我们才能把它写到 chanel 管道中。就我而言,就像:

String ack = "ACK";
    ByteBuf out = ctx.alloc().buffer(ack.length()*2);
    out.writeBytes(ack.getBytes());
    ctx.write(out); 
    ctx.flush();
    LOG.debug("Incoming message. ACK was send");

这可能不是很好的解决方案,但它可以作为示例。

【问题讨论】:

    标签: java sockets jboss network-programming netty


    【解决方案1】:

    如果你更换你的,你会明白为什么它会失败

    ctx.write("Ack"); 
    ctx.flush();
    

    在您的 serverHandler 中使用以下内容:

    ChannelFuture cf = ctx.write("Ack");
    ctx.flush();
    if (!cf.isSuccess()) {
        System.out.println("Send failed: " + cf.cause());
    }
    

    它应该会给您一条消息,指出不支持String

    ByteBuf 应该可以工作:

    ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8));
    ctx.flush();
    

    在客户端编辑channelRead方法:

    ByteBuf in = (ByteBuf) msg;
    System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));
    

    【讨论】:

    • 感谢您的回答!您的解决方案比我自己发现的要好。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2016-01-15
    相关资源
    最近更新 更多