私は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"オブジェクトも送信しますか?
私の前の質問http://stackoverflow.com/:これは、あなたがネッティーエンコーディング/デコーディングの周りにあなたの頭を取得するためにChannelInboundHandlerAdapter
を延長している良い例を使用しているハンドラを想定しています質問/ 39500234 /ソケット - インタラクション - Java デコード - 保護されたメソッド –
私たちはNettyのロジックを変更していますchannelReadでデコーダを使用して、それは良いですか? –
あなたのご意見が分かりません。 UserInfoDecoderのデコードメソッドをオーバーライドしています。これは自分で書いたものとみなします。そのクラスで保護されているのではなく、そのメソッドをpublicにすることはできません。javaでサポートされているサブクラスのフィールドの可視性を高めます。 – etiescu