Nettyは非同期です。つまり、書き込みが失敗したときに例外をスローしません。例外をスローするのではなく、要求が完了したときに更新されるFuture<?>
を返します。あなたの最初のデバッグのステップとして、このから来るすべての例外をログに記録するようにしてください:
単に
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();
}
}
});
以上:
channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
あなたは例外の根本原因を取得した後、複数の問題があるかもしれません。
java.lang.UnsupportedOperationException:
unsupported message type: <type> (expected: ...)
お知らせ:このObjectEncoder
を使用した場合にもスローされますが、あなたのオブジェクトは、Serializable
デフォルトネッティーチャンネルのみByteBuf
sおよびFileRegion
Sを送信することができます実装していません。ハンドラをパイプラインに追加するか、または手動でByteBuf
に変換することによって、これらのタイプにオブジェクトを変換する必要があります。
ByteBuf
は、バイト配列のNettyバリアントですが、ダイレクトメモリ空間に格納できるため、パフォーマンスが向上します。
以下ハンドラが一般的に使用されている:
String
がSerializable
がbyte[]
使用aを変換するObjectEncoder
(通常のJavaオブジェクトのストリームに対応していない警告、) を使用変換するStringEncoder
を使用変換しますByteArrayEncoder
お知らせ: TCPは、ストリームベースのプロトコルであるので、あなたはusuallあなたが書いた正確なパケットを受け取らないかもしれないので、いくつかの形式のパケットサイズが添付されます。詳細については、Netty wikiのDealing with a Stream-based Transportを参照してください。