Netty(五)序列化protobuf在netty中的使用

protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的。它主要优点如下:

1.性能好,效率高;

2.跨语言(java自带的序列化,不能跨语言)

protobuf参考文档:Protobuf详解

其实,在netty中使用Protobuf需要注意的是:

protobufDecoder仅仅负责编码,并不支持读半包,所以在之前,一定要有读半包的处理器。

有三种方式可以选择:

  1. 使用netty提供ProtobufVarint32FrameDecoder
  2. 继承netty提供的通用半包处理器 LengthFieldBasedFrameDecoder
  3. 继承ByteToMessageDecoder类,自己处理半包

Server源码部分:

 1         try {
 2             // ServerBootstrap 类,是启动NIO服务器的辅助启动类
 3             ServerBootstrap b = new ServerBootstrap();
 4             b.group(bossGroup,WorkerGroup)
 5                     .channel(NioServerSocketChannel.class)
 6                     .option(ChannelOption.SO_BACKLOG,1024)
 7                     .childHandler(new ChannelInitializer<SocketChannel>() {
 8                         @Override
 9                         public void initChannel(SocketChannel ch){
10                             // protobufDecoder仅仅负责编码,并不支持读半包,所以在之前,一定要有读半包的处理器。
11                             // 有三种方式可以选择:
12                             // 使用netty提供ProtobufVarint32FrameDecoder
13                             // 继承netty提供的通用半包处理器 LengthFieldBasedFrameDecoder
14                             // 继承ByteToMessageDecoder类,自己处理半包
15
16                             // 半包的处理
17                             ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());
18                             // 需要解码的目标类
19                             ch.pipeline().addLast(new ProtobufDecoder(PersonProbuf.Person.getDefaultInstance()));
20
21                             ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
22
23                             ch.pipeline().addLast(new ProtobufEncoder());
24
25                             ch.pipeline().addLast(new ReqServerHandler());
26                         }
27                     });
28
29             // 绑定端口,同步等待成功
30             ChannelFuture f= b.bind(port).sync();
31
32             // 等待服务端监听端口关闭
33             f.channel().closeFuture().sync();
34         }finally {
35             // 释放线程池资源
36             bossGroup.shutdownGracefully();
37             WorkerGroup.shutdownGracefully();
38         }

client源码部分:

 1 try {
 2             // Bootstrap 类,是启动NIO服务器的辅助启动类
 3             Bootstrap b = new Bootstrap();
 4             b.group(group).channel(NioSocketChannel.class)
 5                     .option(ChannelOption.TCP_NODELAY,true)
 6                     .handler(new ChannelInitializer<SocketChannel>() {
 7                         @Override
 8                         public void initChannel(SocketChannel ch)
 9                                 throws Exception{
10                             //
11                             ch.pipeline().addLast(new ProtobufVarint32FrameDecoder());
12
13                             ch.pipeline().addLast(new ProtobufDecoder(PersonProbuf.Person.getDefaultInstance()));
14                             ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender());
15                             ch.pipeline().addLast(new ProtobufEncoder());
16                             ch.pipeline().addLast(new ReqClientHandler());
17
18                         }
19                     });
20
21             // 发起异步连接操作
22             ChannelFuture f= b.connect(host,port).sync();
23
24             // 等待客服端链路关闭
25             f.channel().closeFuture().sync();
26         }finally {
27             group.shutdownGracefully();
28         }

源码下载

源码在src/main/java/Serialization_ProtoBuf下,分为客户端和服务端,他们的代码基本和Netty入门章节的代码类似,只是增加了Protobuf相关的解码器使用。ProtoBuf文件下,是相关的protobuf的windows下的代码生成器.

GitHub地址:https://github.com/orange1438/Netty_Course

作者:orange1438
出处:http://www.cnblogs.com/orange1438/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
时间: 2024-12-10 23:34:29

Netty(五)序列化protobuf在netty中的使用的相关文章

Google Protobuf在Netty中的使用

[toc] Google Protobuf在Netty中的使用 程序代码来自于<Netty权威指南>第8章,已经加了注释,不过需要注意的是,使用的proto源代码是在Google Protobuf入门与使用中生成的,关于protobuf代码自动生成工具的使用可以参考这篇文章. 例子中,通过解码器ProtobufVarint32FrameDecoder和编码器ProtobufVarint32LengthFieldPrepender的使用已经解决了半包问题,测试时可以把其注释掉,这样就可以演示Ne

一起学Netty(十)之 Netty使用Google的ProtoBuf

protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式,等等.其特点是不限语言.不限平台.扩展性强 Netty也提供了对Protobuf的天然支持,我们今天就写一个简单的示例,简单地了解一下Netty对Google的protoBuf的支持 我们的示例场景很简单的:客户端发送一个信息,这个信息用Protobuf来做序列化,然后服务器端接收这个信息,解码,读取信息 protobuf与xml,json这样的数据格式一样,都有自己的一套语法,且语法很简单,很容

netty 对象序列化传输示例

package object.server.impl; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.nio.NioEventLoopGroup; import io.

【Netty】最透彻的Netty原理架构解析

这可能是目前最透彻的Netty原理架构解析 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下: NIO 的类库和 API 繁杂,使用麻烦.你需要熟练掌握 Selector.ServerSoc

Netty入门系列(3) --使用Netty进行编解码的操作

前言 何为编解码,通俗的来说,我们需要将一串文本信息从A发送到B并且将这段文本进行加工处理,如:A将信息文本信息编码为2进制信息进行传输.B接受到的消息是一串2进制信息,需要将其解码为文本信息才能正常进行处理. 上章我们介绍的Netty如何解决拆包和粘包问题,就是运用了解码的这一功能. java默认的序列化机制 使用Netty大多是java程序猿,我们基于一切都是对象的原则,经常会将对象进行网络传输,那么对于序列化操作肯定大家都是非常熟悉的. 一个对象是不能直接进行网络I/O传输的,jdk默认是

protobuf在java中的字符串化

最近由于项目需要,大致研究了一下protobuf的java使用.说实话,习惯了C++的protobuf,java用起来真别扭. 由于需要将protobuf序列化后,存入redis,而且redis没法直接存储非字符串的数据,所以我只能想办法将protobuf序列化成字符串. protobuf的java实现里,并没有直接序列化成String类型变量的方法,但是提供了toByteArray()方法,可以序列化成byte[]. 于是乎很容易想到可以这么做: byte[] raw_bytes = prot

[转]Netty入门(最简单的Netty客户端/服务器程序)

Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是<netty in action>里面的,不过那个里面的实例有点问题,反正我没有跑成功,修改后成功.直接上代码: 一.服务器编写 Server代码,监听连接 1 package com.gerry.netty.server; 2 3 import io.netty.bootstrap.ServerBoo

Netty构建游戏服务器(三)--netty spring简单整合

一,基本方法 上节实现了netty的基本连接,这节加入spring来管理netty,由spring来开启netty服务. 在netty服务器中,我们建立了三个类:HelloServer(程序主入口) , HelloServerInitializer(传输通道初始化),HelloServerHandler(业务控制器) 这三个类中HelloServer中new了一个HelloServerInitializer,在HelloServerInitializer最后又new了一个HelloServerH

《Dotnet9》系列-Google ProtoBuf在C#中的简单应用

时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.WPF.ASP.NET Core等,亦有C++桌面相关的Qt Quick和Qt Widgets等,只分享自己熟悉的.自己会的. 简介 什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Prot