2014-09-10 19 views
5

Sto provando a fare i primi passi con Netty, per questo motivo ho scritto un semplice server su Netty e un semplice client su oio plain TCP.Netty channel.write not writing message

Il client invia un pacchetto di testo casuale e deve ricevere il messaggio "ack". Vedere il metodo del gestore:

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

} 

Il problema è - quando provo a mandare indietro stringa "Ack" - client riceve nulla. Ma quando provo a rimandare il messaggio in arrivo - funziona bene, e vedo echo nel mio client.

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 

    ctx.write(msg); 
    ctx.flush(); 

write() metodo ha bisogno di Object e ho provato a inviare (Object) String - ma non è successo nulla. Ho anche provato a inviare ByteBuf (l'ho visto in un articolo) e non funziona ancora.

Quando rimando il messaggio in arrivo come eco, funziona. Quando invio qualcos'altro - non è così. Per favore aiutami, non riesco a capire dove sia il mio errore.


Ho risolto questo problema. Il punto era che devi inviare solo ByteBuff. Quindi abbiamo bisogno di crearlo e scriverci qualcosa e solo allora possiamo scriverlo in Chanel. nel mio caso era tipo:

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

Forse questo non è un sollution eccellente, ma funziona come un esempio.

risposta

16

Vedrete il motivo per cui non riesce se si sostituisce il

ctx.write("Ack"); 
ctx.flush(); 

nel vostro serverHandler con il seguente:

ChannelFuture cf = ctx.write("Ack"); 
ctx.flush(); 
if (!cf.isSuccess()) { 
    System.out.println("Send failed: " + cf.cause()); 
} 

dovrebbe dare un messaggio che dice che String non è supportato.

ByteBuf dovrebbe funzionare però:

ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8)); 
ctx.flush(); 

sul lato client modifica il metodo channelRead:

ByteBuf in = (ByteBuf) msg; 
System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8)); 
+0

Grazie per la risposta! La tua soluzione è migliore di quanto mi fossi trovato. – Asprelis