2016-09-16 10 views
0

私はnettyを使用しています。クライアントからサーバーへ、そしてその逆のさまざまなオブジェクトを送信したいと思います。Netty(java)のさまざまなオブジェクトを解析する方法は?

クライアントとサーバーで同じデコーダとエンコーダクラスを作成しました。

デコーダ:

public class UserInfoDecoder extends ByteToMessageDecoder { 
    @Override 
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { 
... 
list.add(new UserInfo(...)) 
} 
} 

エンコーダ:

ここ
public class UserInfoEncoder extends MessageToByteEncoder<UserInfo> { 
     @Override 
     protected void encode(ChannelHandlerContext ctx, UserInfo msg, ByteBuf out) { 
... 
out.writeBytes(...); 
} 

は私のサーバーinitChannel方法です:サーバーハンドラクラスのメソッドchannelReadが

public void initChannel(SocketChannel ch) throws Exception { 
          ChannelPipeline p = ch.pipeline(); 
          if (sslCtx != null) { 
           p.addLast(sslCtx.newHandler(ch.alloc())); 
          } 
          p.addLast(
            // new ObjectEncoder(), 
            // new ObjectDecoder(ClassResolvers.cacheDisabled(null)), 

            new UserInfoDecoder(), 
            new UserInfoEncoder(), 

            new ObjectEchoServerHandler()); 
} 

あり

@Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg) { 


... 
    } 

クライアントから送信されたものとオブジェクトをどのように異ならせるか? 今は "UserInfo"クラスしかなく、 "UserInfo"にchannelReadで "Object msg"をキャストできますが、送信されたタイプによってオブジェクトをどのように異ならせるかなど、 "UsersCar"オブジェクトも送信しますか?

答えて

1

現在の実装が立っているので、これを達成する最も簡単な方法は、エンコードされたバイトに「マジックバイト」プレフィックスを追加してチャネルに送信することです。

public class UserInfoEncoder extends MessageToByteEncoder<UserInfo> { 
    @Override 
    protected void encode(ChannelHandlerContext ctx, UserInfo msg, ByteBuf out) { 
    final int USER_BYTE = 0; 
    out.writeBytes(USER_BYTE); 
    out.writeBytes(msg.toBytes()); 
} 

メッセージがデコードされているときは、このマジックバイトをチェックし、読み取られた値に基づいて適切なデコーダを割り当てます。 など。最初のデコードされていないバイトの値が0の場合は、UserInfoデコーダを使用します。最初のデコードされていないバイトの値が1の場合、UsersCarデコーダを使用します。

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) { 
    final ByteBuf message = (ByteBuf) msg; 
    final byte magicByte= message.getByte(0); 

    if(magicByte == 0){ 
     new UserInfoDecoder().decode(message); 
    }else if { 
    .... 
    } 
} 

最も単純な解決策ではありませんが、最も簡単です。

注:http://shengwangi.blogspot.ie/2016/03/netty-tutorial-hello-world-example.html

+0

私の前の質問http://stackoverflow.com/:これは、あなたがネッティーエンコーディング/デコーディングの周りにあなたの頭を取得するためにChannelInboundHandlerAdapter

を延長している良い例を使用しているハンドラを想定しています質問/ 39500234 /ソケット - インタラクション - Java デコード - 保護されたメソッド –

+0

私たちはNettyのロジックを変更していますchannelReadでデコーダを使用して、それは良いですか? –

+0

あなたのご意見が分かりません。 UserInfoDecoderのデコードメソッドをオーバーライドしています。これは自分で書いたものとみなします。そのクラスで保護されているのではなく、そのメソッドをpublicにすることはできません。javaでサポートされているサブクラスのフィールドの可視性を高めます。 – etiescu

関連する問題