Netty channel.write不写消息
我正在尝试使用Netty迈出第一步,为此目的,我在Netty上编写了简单的服务器,在oio纯TCP上编写了简单的客户端。
客户端发送随机文本数据包,并且必须接收“ Ack”消息。请参阅处理程序方法:
@Overridepublic 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”字符串时-客户端什么也没收到。但是,当我尝试发送回来的消息时,它工作正常,并且我在客户端看到回显。
@Overridepublic 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