原创:
同事倒腾出netty中用到protobuf,自己突然很想尝试自己搭建一个;以下是搭建成果。
.proto文件
package bytebuf; option java_package = "bytebuf"; option java_outer_classname = "Msg"; message MyMessage { optional int32 handler = 1; optional int32 cmd = 2; }
用com.google.protobuf-2.4.0.jar 版本很重要哦。(之前版本问题,加载java类的时候,老爆红)
bat:文件
D: protoc --java_out=. *.proto pause
然后:netty工程下的factory
public class Factory implements ChannelPipelineFactory { public ChannelPipeline getPipeline() throws Exception { ChannelPipeline p = Channels.pipeline(); p.addLast("frameDecoder", new ObjectDecoder()); // p.addLast("protobufDecoder", new ProtobufDecoder(Msg.MyMessage.getDefaultInstance())); // p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender()); p.addLast("protobufEncoder", new ProtobufEncoder()); p.addLast("handler", new Handler()); return p; } }
之前new ProtobufDecoder(Msg.MyMessage.getDefaultInstance 和 ProtobufVarint32LengthFieldPrepender 都得注掉。。。。坑爹呀,被网上的博文忽悠的好惨。
如果用new ProtobufDecoder(Msg.MyMessage.getDefaultInstance ,后面的只能读取Msg.MyMessage.真心不好扩展。
所以哩,我加了个类转化成我想要的对象Message
public class Message<T> { public int handler = 0; public int cmd = 0; public T body ; //我的protobuf类 }
为啥我要用ObjectDecoder解码哩~
因为
public class ObjectDecoder extends FrameDecoder { @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { short cmd = buffer.readShort(); Message msg1 = new Message(); msg1.handler = cmd; //可以有个Map容器,根据cmd获得不同的protobuf类,赋给msg1.body, 因为msg1.body的类型是T。 Msg.MyMessage msg = Msg.MyMessage.parseFrom(buffer.array()); msg1.body = msg; eturn msg1; } }
在Handler类里
public class Handler extends SimpleChannelUpstreamHandler { Message msg = (Message) e.getMessage(); //也可以在map容器里根据msg.cmd的值,获得指定的protobuf类 Msg.MyMessage msg1 = (Msg.MyMessage)msg.body; System.err.println( " , handler = " + msg1.getHandler() + " , cmd = " + msg1.getCmd()); }
client:
public static void main(String[] args) throws Exception { Socket socket = new Socket(); socket.connect(new InetSocketAddress(9090)); OutputStream out = socket.getOutputStream(); ByteArrayC bc = new ByteArrayC(); Msg.MyMessage.Builder msg = Msg.MyMessage.newBuilder(); msg.setHandler(35); msg.setCmd(25); bc.writeShort(50); bc.writeByteArray(msg.build().toByteArray()); out.write(bc.toArray()); Thread.sleep(50 * 60 * 1000); }
netty下可以使用不同的protobuf文件,这样就很轻松了。
相关推荐
protobuf-netty-Demo
基于tcp通讯,涉及java的netty服务器的推送功能和c++socket的封装以及protobuf在java和c++中的使用。
Netty发送protoBuf格式数据 Netty发送protoBuf格式数据 Netty发送protoBuf格式数据 Netty发送protoBuf格式数据
使用java语言编写的,基于netty和protobuf的聊天系统,有客户端和服务器。
java服务器端(Netty_Proto)和c++客户端tcp通讯
java netty 服务端 + unity客户端 +protobuf3 实现网游通讯demo
Netty中集成Protobuf实现Java对象数据传递示例代码.rar
在使用netty进行网络通信协议传输使用protobuf时protobuf编译.proto文件生成JAVA类.zip 包括测试proto3.proto文件,自动protobuf编译.proto文件生成JAVA类
netty案例,netty4.1中级拓展篇二《Netty使用Protobuf传输数据》源码 https://mp.weixin.qq.com/s?__biz=MzIxMDAwMDAxMw==&mid=2650724807&idx=1&sn=e0d27e61423a8cf0ed7bc0b9663d1ff7&scene=19#wechat_redirect
客户端与服务端通信,协议用protoBuf。maven项目,其中有startClient与startServer两个mainClass。不懂的可以留言
netty5 google protoc-2.5与protobuf-java-2.5.0.jar.rar 目前是可以用的
Springboot2.0.8集成 netty4 ,使用protobuf作为ping的数据交换,比json更加的小巧,占用数据量更小,可用于任何第三方应用做心跳监控。 已完成功能: - 客户端授权验证(基于protoBuff) - 心跳检测(基于protoBuff) ...
基于tcp通讯,涉及java的netty服务器的推送功能和c++socket的封装以及protobuf在java和c++中的使用。
15_Protobuf集成Netty与多协议消息传递;16_Protobuf多协议消息支援与工程最佳实践;17_Protobuf使用最佳实践与Apache Thrift介绍;18_Apache Thrift应用详解与实例剖析;19_Apache Thrift原理与架构解析;20_通过...
java快速上手的网络IO框架,基于netty, google protobuf 数据传输协议.zip
一个基于Java的开源游戏服务器框架实现,使用了Netty、ProtoBuf、Disruptor等
Netty:它使 NIO 编程更加容易,屏蔽了 Java 底层的 NIO 细节。 Protostuff:它基于 Protobuf 序列化框架,面向 POJO,无需编写 .proto 文件。 ZooKeeper:提供服务注册与发现功能,开发分布式系统的必备选择,同时...
3_Netty课程大纲深度解读 4_项目环境搭建与Gradle配置 5_Netty执行流程分析与重要组件介绍 6_Netty回调与Channel执行流程分析 7_Netty的Socket编程详解 8_Netty多客户端连接与通信 9_Netty读写检测机制与长连接要素 ...
本实例是《Netty 粘包/半包原理与拆包...具体的文章为: Netty +Protobuf 整合二:protobuf 消息通讯协议设计的几个准则 在开始聊天器实战开发之前,还有一个非常基础的问题,需要解决:这就是通讯的粘包和半包问题。
第3讲:Netty课程大纲深度解读 第4讲:项目环境搭建与Gradle配置 第5讲:Netty执行流程分析与重要组件介绍 第6讲:Netty回调与Channel执行流程分析 第7讲:Netty的Socket编程详解 第8讲:Netty多客户端连接与...