Netty的channel.write没有写入消息

8
我正在尝试使用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。因此我们需要创建它,并将一些内容写入它,只有这样,我们才能将其写入通道管道。在我的情况下,它是这样的:

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");

也许这不是最优秀的解决方案,但它作为一个例子是可行的。
1个回答

25

如果您替换您的内容,您将会看到为什么它会失败。

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));

谢谢你的回答!你的解决方案比我自己找到的更好。 - Asprelis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接