当前位置: 首页 > 知识库问答 >
问题:

如何解析Netty(Java)中的各种对象?

能钟展
2023-03-14

我使用netty,我想将各种对象从客户端发送到服务器,反之亦然。

我在客户端和服务器上创建了相同的解码器和编码器类;

解码器:

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方法:

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

服务器处理程序类中有一个方法channelRead

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


...
    }

如何区分客户端发送的对象?对于例如,现在我只有“UserInfo”类,我可以将channelRead中的“object Msg”转换为“UserInfo”,但我也想发送“UserSCAR”对象,例如,如何通过发送的类型来区别对象?

共有1个答案

宇文峰
2023-03-14

按照当前的实现方式,最简单的实现方法是在通过通道发送编码字节之前,在编码字节中添加一个“魔术字节”前缀。

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 {
    ....
   }
}

不是最利索的解决方案,而是最简单的。

注意:这是假设您使用的处理程序是扩展ChannelInboundHandlerAdapter

了解Netty编码/解码的一个很好的示例:http://shengwangi.blogspot.ie/2016/03/netty-tutorial-hello-world-example.html

 类似资料:
  • 目前,我在netty管道的末尾有一个处理程序,它处理几乎所有的请求逻辑。(使用jackson、身份验证、速率限制等从json解析对象。如果把这些放在执行器之后的管道中的各个阶段,是不是更好地使用管道结构?

  • 本文向大家介绍java中request对象各种方法的使用实例分析,包括了java中request对象各种方法的使用实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java中request对象各种方法的使用。分享给大家供大家参考,具体如下: request对象是从客户端向服务器端发出请求,包括用户提交的信息以及客户端的一些信息。request对象是javax.servlet.http

  • 问题内容: 用Java解析多个离散的自定义XML文档的最佳方法是什么? 问题答案: 我将使用Stax解析XML,它既快速又易于使用。我在上一个项目中一直使用它来解析最大24MB的XML文件。java.net上有一个不错的介绍,它告诉您入门所需的一切。

  • 我有一个作业要创建一个应用程序,当通过微调器选择学生的名字时,该应用程序会显示学生的名字和最终字母等级。我已经用名称设置了微调器,我已经从存储在资产中的文本文件中读取了名称和等级。我使用StringBuilder将该文件中的所有信息拆分为一个字符串数组。我想将这些数据解析成一个名为Student的对象,这样我就可以处理每个学生的成绩,但我不知道如何做到这一点。感谢您的帮助! 文本文件: 到目前为止

  • 问题内容: 我有一个非常大的JSON文件,格式如下: 它看起来像一个JSONArray。所有记录都写在同一行中。 您能帮我如何使用Java解析此文件。我想读取每个JSON对象并显示所有全名和ID。以下是我的尝试,但是我的代码无法正常工作: 问题答案: 好的,伙计们……解决了我的问题。我正在发布解决方案,以防有人再次遇到相同的问题,可以使用我的解决方案。我的解决方案部分是由Rahul Rabhadi

  • 本文向大家介绍深入剖析Java中的各种异常处理方式,包括了深入剖析Java中的各种异常处理方式的使用技巧和注意事项,需要的朋友参考一下 1. 调试追踪代码: 2. 抛出Exception,没有finally,当catch遇上return     后台输出结果: 3. 抛出Exception,当catch体里有return,finally体的代码块将在catch执行return之前被执行     后