protobuf是google序列化的工具,主要是把數據序列化成二進制的數據來傳輸用的。它主要優點如下:
1.性能好,效率高;
2.跨語言(java自帶的序列化,不能跨語言)
protobuf參考文檔:Protobuf詳解
其實,在netty中使用Protobuf需要注意的是:
protobufDecoder僅僅負責編碼,並不支持讀半包,所以在之前,一定要有讀半包的處理器。
有三種方式可以選擇:
- 使用netty提供ProtobufVarint32FrameDecoder
- 繼承netty提供的通用半包處理器 LengthFieldBasedFrameDecoder
- 繼承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/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。