iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >基于Protostuff怎么实现Netty编解码器
  • 141
分享到

基于Protostuff怎么实现Netty编解码器

2024-04-02 19:04:59 141人浏览 安东尼
摘要

本篇内容主要讲解“基于Protostuff怎么实现Netty编解码器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Protostuff怎么实现Netty编解

本篇内容主要讲解“基于Protostuff怎么实现Netty编解码器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Protostuff怎么实现Netty编解码器”吧!

  在设计netty的编解码器过程中,有许多组件可以选择,这里由于咱对Protostuff比较熟悉,所以就用这个组件了。由于数据要在网络上传输,所以在发送方需要将类对象转换成二进制,接收方接收到数据后,需要将二进制转换成类对象。

  public class SerializeUtil {

  private static class SerializeData{

  private Object target;

  }

  @SuppressWarnings("unchecked")

  public static byte[] serialize(Object object) {

  SerializeData serializeData = new SerializeData();

  serializeData.target = object;

  Class<SerializeData> serializeDataClass = (Class<SerializeData>) serializeData.getClass();

  LinkedBuffer linkedBuffer = LinkedBuffer.allocate(1024 * 4);

  try {

  Schema<SerializeData> schema = RuntimeSchema.getSchema(serializeDataClass);

  return ProtostuffioUtil.toByteArray(serializeData, schema, linkedBuffer);

  } catch (Exception e) {

  throw new IllegalStateException(e.getMessage(), e);

  } finally {

  linkedBuffer.clear();

  }

  }

  @SuppressWarnings("unchecked")

  public static <T> T deserialize(byte[] data, Class<T> clazz) {

  try {

  Schema<SerializeData> schema = RuntimeSchema.getSchema(SerializeData.class);

  SerializeData serializeData = schema.newMessage();

  ProtostuffIOUtil.mergeFrom(data, serializeData, schema);

  return (T) serializeData.target;

  } catch (Exception e) {

  throw new IllegalStateException(e.getMessage(), e);

  }

  }

  }

  但是,上面只是普通的操作Util,如何让数据能够在netty上进行传输呢?

  在netty中,如果想发送数据出去,那么需要将数据转换成二进制,然后通过网络传送出去,他提供了MessageToByteEncoder的操作类,用户需要继承此类,然后实现encode方法就可以了。来看看我们如何将我们写好的SerializeUtil操作类集成进去:

  public class NettyMessageEncoder extends MessageToByteEncoder<NettyMessage> {

  @Override

  protected void encode(ChannelHandlerContext ctx, NettyMessage msg, ByteBuf out) throws Exception {

  out.writeBytes(SerializeUtil.serialize(msg));

  }

  }

  如上代码所示,我们就准备好了一个基于Protostuff组件实现的编码类了。编码后的数据,被添加到ByteBuf缓冲区后,被发送出去。

  那么如何来实现解码器呢?

  public class NettyMessageDecoder extends LengthFieldBasedFrameDecoder{

  public NettyMessageDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) {

  super(maxFrameLength, lengthFieldOffset, lengthFieldLength);

  }

  @Override

  public  Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {

  try {

  byte[] dstBytes = new byte[in.readableBytes()];

  //in.getBytes(in.readerIndex(), dstBytes);

  //切记这里一定要用readBytes,不能用getBytes,否则会导致readIndex不能向后移动,从而导致netty did not read anything but decoded a message.错误

  in.readBytes(dstBytes,0,in.readableBytes());

  NettyMessage nettyMessage = SerializeUtil.deserialize(dstBytes, NettyMessage.class);

  return nettyMessage;

  } catch (Exception e) {

  System.out.println("exception when decoding: " + e);

  return null;

  }

  }

  }

  如上代码所示。一般情况下,需要继承netty中的ByteToMessageDecoder操作类来实现,但是考虑到这样的话需要用户自己来处理粘包拆包问题,比较麻烦,所以我们就继承自netty中为我们准备好的LengthFieldBasedFrameDecoder来进行,由于此decoder具有处理粘包拆包的功能,而且其继承自ByteToMessageDecoder类,所以就省去了我们处理粘包拆包的逻辑。

  需要注意的是,在进行解码的过程中,我们首先需要从缓冲区读取数据到byte数组中,然后需要将readerIndex标记往后移动,如果读完后不移动的话,会报netty did not read anything but decoded a message的错误,而且这个错误在你运行的时候并不会抛出来,非常隐蔽,要不是细细的调试客户端,根本不能发觉此错误的存在。

  所以从上面代码可以看出,ByteBuf.getBytes,只是单纯的读取缓存区数据,并不会将readerIndex后移。但是ByteBuf.readBytes则会将readerIndex后移。这点必须重视。

  最后,我们将这两个实现类放到handler执行容器中即可。

  channel.pipeline()。addLast("nettyMessageDecoder", new NettyMessageDecoder(1024 * 1024, 4, 4));

  channel.pipeline()。addLast("nettyMessageEncoder", new NettyMessageEncoder());

  channel.pipeline()。addLast("readTimeoutHandler", new ReadTimeoutHandler(50));

  channel.pipeline()。addLast("loginAuthResponseHandler", new LoginAuthResponseHandler());

  channel.pipeline()。addLast("heartBeatHandler", new HeartBeatResponseHandler());

  最后启动服务,我们就可以看到我们的编解码器正常跑起来了:

  Login is ok: Netty Message [header=Header [crcCode=-1410399999,length=0,sessionId=0,type=4,priority=0,attachment={}]]

  Client send heart beat message to server : ----> Netty Message [header=Header [crcCode=-1410399999,length=0,sessionId=1344,type=5,priority=0,attachment={}]]

  Client receive server heartbeat message : ---> Netty Message [header=Header [crcCode=-1410

到此,相信大家对“基于Protostuff怎么实现Netty编解码器”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 基于Protostuff怎么实现Netty编解码器

本文链接: https://www.lsjlt.com/news/95348.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Protostuff怎么实现Netty编解码器
    本篇内容主要讲解“基于Protostuff怎么实现Netty编解码器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Protostuff怎么实现Netty编解...
    99+
    2024-04-02
  • netty中常用的xml编码解码器怎么用
    这篇文章主要讲解了“netty中常用的xml编码解码器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“netty中常用的xml编码解码器怎么用”吧!简介在json之前,xml是最常用的数...
    99+
    2023-06-30
  • 基于JS怎么实现一个小型编译器
    这篇文章主要讲解了“基于JS怎么实现一个小型编译器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于JS怎么实现一个小型编译器”吧!前言the-super-tiny-compiler&nbs...
    99+
    2023-06-30
  • 基于Java怎么实现扫码登录
    这篇文章主要介绍了基于Java怎么实现扫码登录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Java怎么实现扫码登录文章都会有所收获,下面我们一起来看看吧。原理解析1. 身份认证机制在介绍扫码登录的原理之前...
    99+
    2023-06-30
  • netty中的frame解码器怎么用
    这篇文章主要介绍“netty中的frame解码器怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“netty中的frame解码器怎么用”文章能帮助大家解决问题。简介netty中的数据是通过Byte...
    99+
    2023-06-30
  • Java基于IDEA实现http编程的示例代码
    http开发前言之为什么要有应用层 我们已经学过TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程 [ IP+Port ],可是,仅仅把数据从A点传...
    99+
    2024-04-02
  • 基于JS实现一个小型编译器
    目录前言ParseTransformTraversal(遍历)Visitors(访问)Code generate代码实现词法分析器(tokenizer)语法分析器(parser)遍历...
    99+
    2024-04-02
  • 基于ASP.NET实现验证码生成详解
    作业:验证码 要求: (1)验证码应该是图片格式,不能是文字格式,即无法用鼠标选中。 (2)验证码上应该有噪点和干扰线条。 (3)验证码应该回避相似字符,如“0&rdqu...
    99+
    2024-04-02
  • 基于C语言实现泛型编程详解
    目录心理历程轮子用法大体流程部分源码心理历程 写了一段时间C++后,真心感觉STL里的容器是个好东西。一个容器可以容纳任意类型,容器对外的接口可以操作任意类型的数据,甚至包括自定义类...
    99+
    2024-04-02
  • 基于C++怎么编写一个Json解析器
    这篇文章主要介绍了基于C++怎么编写一个Json解析器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于C++怎么编写一个Json解析器文章都会有所收获,下面我们一起来看看吧。代码JsonSerialize.h...
    99+
    2023-07-05
  • java编程之基于SpringBoot框架实现扫码登录
    目录项目简介实现思路二次认证的原因实现步骤用户访问网页端,选择扫码登录使用手机扫码,二维码状态改变手机确认登录效果演示完整代码已上传到GitHub。 Web端体验地址:http://...
    99+
    2024-04-02
  • 基于Python怎么编写一个二维码生成器
    这篇“基于Python怎么编写一个二维码生成器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么编写一个二维...
    99+
    2023-07-02
  • 基于JS怎么实现二维码名片生成
    这篇文章主要介绍“基于JS怎么实现二维码名片生成”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于JS怎么实现二维码名片生成”文章能帮助大家解决问题。演示技术栈这里用到了一个二维码生成库qrcode...
    99+
    2023-07-02
  • Android BLE怎么实现扫码枪基于BLESSED开发
    这篇文章主要介绍“Android BLE怎么实现扫码枪基于BLESSED开发”,在日常操作中,相信很多人在Android BLE怎么实现扫码枪基于BLESSED开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-29
  • Java怎么实现UTF-8编码与解码
    这篇文章主要介绍了Java怎么实现UTF-8编码与解码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现UTF-8编码与解码文章都会有所收获,下面我们一起来看看吧。Java实现UTF-8编码与解码J...
    99+
    2023-07-06
  • php怎么实现Base64的编码和解码
    Base64算法是一种将二进制数据转换为ASCII字符的编码方式,使得数据可以在传输过程中不被修改或损坏,同时也可以隐藏数据的真实内容。在PHP中,可以利用内置函数或手动编写代码实现Base64的编码和解码。PHP内置函数的使用PHP中提供...
    99+
    2023-05-14
    Base64 php
  • Python实现网页爬虫基本实现代码怎么编写
    Python实现网页爬虫基本实现代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python是一款功能强大的计算机程序语言,同时也可以被看做是一款面向...
    99+
    2023-06-17
  • 基于Python怎么实现文件分类器
    本篇内容主要讲解“基于Python怎么实现文件分类器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python怎么实现文件分类器”吧!通过自定义需要整理的文件目录,将该目录下面的全部文件按照...
    99+
    2023-07-05
  • 基于GPT-4编写、解释代码的新一代编辑器Cursor
    上周,Open AI 团队正式宣布:GPT-4 来了! GPT-4 的出现,随后 Microsoft 的多个产品就集成了 GPT-4。 紧接着基于 Open AI 公司发布的 GPT...
    99+
    2023-03-22
    cursor编辑器 集成GPT4的Cursor编辑器 cursor编辑器怎么使用
  • 基于Python怎么实现音乐播放器
    本篇内容主要讲解“基于Python怎么实现音乐播放器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python怎么实现音乐播放器”吧!一、环境设置第一步引入必须的各类包import ...
    99+
    2023-06-30
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作