2016-11-29 14 views
0

Nettyで書き込もうとすると、書き込まれたデータはWiresharkで確認されたリモート側で決して終了しません。Nettyは書き込みしません

私が試してみました:私はこの問題をデバッグするために何ができる私はtry{...}catch(Throwable e){e.printStackTrace();}

でそれを包むとき

//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}); 

も例外がキャッチされていませんか?

答えて

4

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バリアントですが、ダイレクトメモリ空間に格納できるため、パフォーマンスが向上します。

以下ハンドラが一般的に使用されている:

StringSerializablebyte[]使用aを変換するObjectEncoder(通常のJavaオブジェクトのストリームに対応していない警告、) を使用変換するStringEncoder を使用変換しますByteArrayEncoder

お知らせ: TCPは、ストリームベースのプロトコルであるので、あなたはusuallあなたが書いた正確なパケットを受け取らないかもしれないので、いくつかの形式のパケットサイズが添付されます。詳細については、Netty wikiのDealing with a Stream-based Transportを参照してください。

関連する問題