2014-09-10 55 views
5

我試圖用Netty做我的第一步,爲此我在Netty上寫了簡單的服務器,並在oio普通TCP上寫了簡單的客戶端。Netty channel.write不寫信息

客戶端發送隨機文本包,並且必須收到「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); 

} 

的問題是 - 當我嘗試發送回「確認」串 - 客戶端收到沒有。 但是,當我嘗試發回消息傳入 - 它工作正常,並且我在客戶端看到回聲。 ()方法需要對象,我試圖發送(對象)字符串 - 但沒有任何事情發生。 我也嘗試發送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"); 

可能是這不是exelent溶劑,但它作爲例子。

回答

16

你會看到失敗的原因,如果你有以下取代你

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

感謝名單的回答!你的解決方案比我發現自己更好。 – Asprelis 2014-09-10 09:46:11