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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM