java netty

java - Netty no escribe



(1)

Netty es asíncrono, lo que significa que no arrojará excepciones cuando falla una escritura. En lugar de lanzar excepciones, devuelve un Future<?> Que se actualizará cuando se realice la solicitud. Asegúrese de registrar cualquier excepción que provenga de esto como sus primeros pasos de depuración:

channel.writeAndFlush(...).addListener(new GenericFutureListener<Future<Object>>() { @Override public void operationComplete(Future<Object> future) { // TODO: Use proper logger in production here if (future.isSuccess()) { System.out.println("Data written succesfully"); } else { System.out.println("Data failed to write:"); future.cause().printStackTrace(); } } });

O más simplemente:

channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);

Después de obtener la causa raíz de la excepción, podría haber múltiples problemas:

java.lang.UnsupportedOperationException:
unsupported message type: <type> (expected: ...)

Aviso: Esto también se produce cuando se utiliza un ObjectEncoder , pero su objeto no implementa Serializable

Un canal predeterminado de Netty solo puede enviar ByteBuf sy FileRegion . ByteBuf convertir sus objetos a estos tipos agregando más controladores a la tubería o convirtiéndolos manualmente en ByteBuf s.

Un ByteBuf es la variante Netty de una matriz de bytes, pero tiene el potencial de rendimiento porque puede almacenarse en el espacio de memoria directa.

Los siguientes manejadores se usan comúnmente:

Para convertir un String use un StringEncoder Para convertir un Serializable use un ObjectEncoder (advertencia, no es compatible con las secuencias normales de objetos Java). Para convertir un byte[] use un ByteArrayEncoder

Aviso: Dado que TCP es un protocolo basado en transmisión, generalmente desea adjuntar algún tipo de tamaño de paquete, ya que es posible que no reciba los paquetes exactos que escribe. Consulte Manejo de un transporte basado en secuencias en el wiki de Netty para obtener más información.

Al intentar escribir con netty, los datos escritos nunca terminan en el lado remoto, confirmado con Wireshark.

Yo he tratado:

//Directly using writeAndFlush channel.writeAndFlush(new Packet()); //Manually flushing channel.write(new Packet()); channel.flush(); // Even sending bytes won''t work: channel.writeAndFlush(new byte[]{1,2,3});

No se try{...}catch(Throwable e){e.printStackTrace();} ninguna excepción cuando lo envuelvo en try{...}catch(Throwable e){e.printStackTrace();}

¿Qué puedo hacer para depurar este problema?