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.
Grazie per la risposta! La tua soluzione è migliore di quanto mi fossi trovato. – Asprelis