Netty channel.write不写消息

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

客户端发送随机文本包,并且必须接收“确认”消息。 请参阅处理程序方法:

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

可能这不是特有的溶剂,但它可以作为例子。

如果你更换你的,你会看到它失败的原因

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