¿Cómo leer/escribir con Netty cuando el otro lado está usando Readutf/Writeutf?
Pregunta
Estoy tratando de comunicarme con un servidor que usa DataInputStream.Readutf y DataOutputStream.Writeutf.
Hice el código de arranque habitual para configurar mi cliente y establecer la siguiente PipelineFactory
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(
new LengthFieldBasedFrameDecoder(65536, 0, 2),
new StringDecoder(CharsetUtil.UTF_8),
new StringEncoder(CharsetUtil.UTF_8),
new MyClientHandler());
}
});
En MyClientHandler que extiende SimpleChannelUpStreamHandler, tengo lo siguiente:
boolean sent = false; //is this thread safe?
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
logger.log(Level.INFO, e.getMessage().toString());
e.getChannel().write("Hello over there!");
if(!sent){
//do something and set sent
}
}
Me las arreglé para recibir mensajes del servidor con éxito, pero el servidor no recibe mi mensaje "hola". No estoy seguro de lo que podría haber pasado por alto.
Además, observe el booleano enviado, ¿puedo agregar tales campos y trabajar con ellos sin inquietudes?
Solución
- Me las arreglé para recibir mensajes del servidor con éxito, pero el servidor no recibe mi mensaje "hola". No estoy seguro de lo que podría haber pasado por alto.
Debido a que el mensaje del servidor se pudo recibir utilizando LongfieldFramedCoder, el mensaje tiene un campo de longitud.
+--------+----------+
| Length | Message |
+--------+----------+
Por lo tanto, existe la posibilidad de que el servidor espere que el mensaje recibido tenga el campo Longitud. ¿Cómo si el campo de longitud se escribe de la siguiente manera?
+--------+---------------------+
| 0x0011 | "Hello over there!" |
+--------+---------------------+
muestra
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
logger.log(Level.INFO, e.getMessage().toString());
byte[] message = "Hello over there!".getBytes("UTF-8");
ChannelBuffer buf = ChannelBuffers.buffer(message.length + 2);
buf.clear();
short len = (short)message.length;
buf.writeShort(len);
buf.writeBytes(message);
e.getChannel().write(buf);
if(!sent){
//do something and set sent
}
}
- Además, observe el booleano enviado, ¿puedo agregar tales campos y trabajar con ellos sin inquietudes?
Sí, puede agregar los campos para almacenar algún estado. Y no necesita considerar la sincronización del hilo.