¿Cómo leer/escribir con Netty cuando el otro lado está usando Readutf/Writeutf?

StackOverflow https://stackoverflow.com/questions/4787286

  •  24-10-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top