Netty channel.write不写消息

时间:2014-09-10 08:33:38

标签: java sockets jboss network-programming netty

我试图用Netty做我的第一步,为此我在Net上编写了简单的服务器,在oio plain 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);

}

问题是 - 当我尝试发回'#34; 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");

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

1 个答案:

答案 0 :(得分:17)

如果更换

,您将看到失败的原因
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));