Netty channel.write不写消息

我正在尝试使用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");

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

回答:

您将看到为什么如果更换您的打印机失败

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

以上是 Netty channel.write不写消息 的全部内容, 来源链接: utcz.com/qa/405901.html

回到顶部