原创:
同事倒腾出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文件,这样就很轻松了。
相关推荐
为了实现高效的数据通信,开发者常常会结合其他技术,如Netty和ProtoBuf。本篇文章将深入探讨如何在Unity中利用ProtoBuf-net与Netty进行通信。 ProtoBuf(Protocol Buffers)是Google提出的一种数据序列化协议,它...
本话题将探讨如何使用C++客户端与Java(通过Netty框架)服务器端实现TCP通讯,并涉及数据序列化工具Protocol Buffers(protobuf)在两者之间的交互。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节...
protobuf-netty-Demo
标题中的“java服务器端(Netty_Proto)和c++客户端tcp通讯”表明这是一个关于使用Java的Netty框架和Google的Protocol Buffers(ProtoBuf)进行TCP通信的项目。Netty是一个高性能、异步事件驱动的网络应用框架,常...
3. 配置Spring Boot:在Spring Boot的配置文件中添加Netty和protobuf的相关依赖,配置服务器端口和protobuf的编码解码器。 4. 创建Netty Server:编写Netty服务器端代码,使用protobuf的Decoder和Encoder处理进来的...
在Java编程环境中,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可伸缩、高并发的服务器。本示例关注的是如何利用Netty实现一个基于UDP(User Datagram Protocol)的数据接收服务,这在需要进行...
3. **Netty客户端**:客户端代码负责与服务器建立连接,发送protobuf编码的消息,并接收并解码服务器返回的消息,展示给用户。 4. **事件驱动模型**:Netty使用事件驱动模型,通过ChannelHandlerContext处理网络...
Netty 提供了对 Protobuf 的支持,我们可以使用 Protobuf 的 `.proto` 文件生成相应的 Java 类,然后在 Netty 中处理这些类。以下是一般步骤: 1. **定义 Protobuf 消息**:创建一个 `.proto` 文件,定义消息结构。...
2. 编译protobuf3消息:使用protobuf编译器将.proto文件转换为Java和C#代码,生成的消息类可以直接在Netty服务器和Unity客户端中使用。 3. 创建Netty ChannelHandler:实现自定义的ChannelInboundHandler和...
标题中的“Netty实现Java服务端和C#客户端联通”是指使用Netty作为Java服务器框架,与C#客户端(使用DotNetty库)进行通信的一种技术实现。这涉及到跨平台的网络通信,以及两个不同编程语言间的交互。 Netty是Java...
Netty 集成了Protobuf的支持,提供了 `ProtobufDecoder` 和 `ProtobufEncoder`,使得我们在Netty中可以方便地处理Protobuf消息。使用Protobuf,开发者可以定义结构化的数据模型,并在Java、C++、Python等多语言之间...
Netty4+ProtoBuf通信框架是一种高效的网络应用框架,它结合了Netty的高性能和Google的Protocol Buffers(ProtoBuf)的数据序列化能力,用于构建可伸缩、高并发的网络应用程序。在这个项目中,客户端和服务端之间的...
总的来说,Netty发送protoBuf格式数据的过程包括定义数据结构、生成Java类、编写编码解码器、配置Netty管道以及在服务器和客户端之间发送和接收消息。这种结合提供了强大而高效的网络通信解决方案,适用于多种应用...
本话题聚焦于使用Netty和Protocol Buffers(Protobuf)来实现文件传输,这是一种现代且高性能的技术组合,尤其适用于大规模分布式系统。 Netty是一个开源的异步事件驱动的网络应用程序框架,用于快速开发可维护的高...
`lib`目录则可能包含了Netty和Protobuf的相关依赖库,例如netty-all.jar和protobuf-java.jar。 总的来说,Netty与Protobuf的结合提供了高效、可靠的网络通信解决方案。通过自定义的编解码器,我们能够方便地在Java...
在Java世界里,Netty和Protobuf是两个非常重要的技术组件。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建高并发、低延迟的网络服务。而Protobuf(Protocol Buffers)是Google推出的一种数据序列化...
java netty 服务端 + unity客户端 +protobuf3 实现网游通讯demo
Netty是一个Java NIO框架,它提供了一套高度定制且易于使用的API,用于构建高性能、高并发的网络应用程序。Netty的优势在于它的事件驱动模型,通过使用Boss-Worker线程模型,能够有效地处理大量并发连接。在服务器端...
3. **数据传输**:HTTP协议负责将客户端发送的数据可靠地传输到服务器,而Protobuf保证了数据在传输过程中的高效编码和解码。 4. **响应处理**:服务器处理完请求后,使用Protobuf编码响应数据,再通过HTTP响应返回...
`HelloNetty`可能是一个示例项目,展示如何在使用Netty框架的网络应用中利用ProtoBuf进行数据传输。Netty提供了ChannelHandlerContext对象的writeAndFlush()方法,可以直接将ProtoBuf序列化的字节流写入网络通道。...