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 unStringEncoder
Para convertir unSerializable
use unObjectEncoder
(advertencia, no es compatible con las secuencias normales de objetos Java). Para convertir unbyte[]
use unByteArrayEncoder
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?