`

java protobuf netty3

 
阅读更多

原创:

同事倒腾出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文件,这样就很轻松了。

 

分享到:
评论

相关推荐

    Unity与Netty进行ProtoBuf通信__

    为了实现高效的数据通信,开发者常常会结合其他技术,如Netty和ProtoBuf。本篇文章将深入探讨如何在Unity中利用ProtoBuf-net与Netty进行通信。 ProtoBuf(Protocol Buffers)是Google提出的一种数据序列化协议,它...

    c++客户端和java(Netty)服务器端tcp通讯

    本话题将探讨如何使用C++客户端与Java(通过Netty框架)服务器端实现TCP通讯,并涉及数据序列化工具Protocol Buffers(protobuf)在两者之间的交互。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节...

    protobuf-netty-Demo

    protobuf-netty-Demo

    java服务器端(Netty_Proto)和c++客户端tcp通讯.rar

    标题中的“java服务器端(Netty_Proto)和c++客户端tcp通讯”表明这是一个关于使用Java的Netty框架和Google的Protocol Buffers(ProtoBuf)进行TCP通信的项目。Netty是一个高性能、异步事件驱动的网络应用框架,常...

    springboot集成netty,使用protobuf作为数据交换格式,可以用于智能终端云端服务脚手架

    3. 配置Spring Boot:在Spring Boot的配置文件中添加Netty和protobuf的相关依赖,配置服务器端口和protobuf的编码解码器。 4. 创建Netty Server:编写Netty服务器端代码,使用protobuf的Decoder和Encoder处理进来的...

    java实现基于netty 的udp字节数据接收服务

    在Java编程环境中,Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可伸缩、高并发的服务器。本示例关注的是如何利用Netty实现一个基于UDP(User Datagram Protocol)的数据接收服务,这在需要进行...

    基于netty和protobuf的聊天系统,客户端+服务器

    3. **Netty客户端**:客户端代码负责与服务器建立连接,发送protobuf编码的消息,并接收并解码服务器返回的消息,展示给用户。 4. **事件驱动模型**:Netty使用事件驱动模型,通过ChannelHandlerContext处理网络...

    netty+protobuf入门案例

    Netty 提供了对 Protobuf 的支持,我们可以使用 Protobuf 的 `.proto` 文件生成相应的 Java 类,然后在 Netty 中处理这些类。以下是一般步骤: 1. **定义 Protobuf 消息**:创建一个 `.proto` 文件,定义消息结构。...

    Netty Protobuf3 测试服务器

    2. 编译protobuf3消息:使用protobuf编译器将.proto文件转换为Java和C#代码,生成的消息类可以直接在Netty服务器和Unity客户端中使用。 3. 创建Netty ChannelHandler:实现自定义的ChannelInboundHandler和...

    Netty实现Java服务端和C#客户端联通

    标题中的“Netty实现Java服务端和C#客户端联通”是指使用Netty作为Java服务器框架,与C#客户端(使用DotNetty库)进行通信的一种技术实现。这涉及到跨平台的网络通信,以及两个不同编程语言间的交互。 Netty是Java...

    netty学习文件,实现http,websocket,protobuf

    Netty 集成了Protobuf的支持,提供了 `ProtobufDecoder` 和 `ProtobufEncoder`,使得我们在Netty中可以方便地处理Protobuf消息。使用Protobuf,开发者可以定义结构化的数据模型,并在Java、C++、Python等多语言之间...

    Netty4+ProtoBuf通信框架

    Netty4+ProtoBuf通信框架是一种高效的网络应用框架,它结合了Netty的高性能和Google的Protocol Buffers(ProtoBuf)的数据序列化能力,用于构建可伸缩、高并发的网络应用程序。在这个项目中,客户端和服务端之间的...

    Netty发送protoBuf格式数据

    总的来说,Netty发送protoBuf格式数据的过程包括定义数据结构、生成Java类、编写编码解码器、配置Netty管道以及在服务器和客户端之间发送和接收消息。这种结合提供了强大而高效的网络通信解决方案,适用于多种应用...

    采用netty与protobuf进行文件传输

    本话题聚焦于使用Netty和Protocol Buffers(Protobuf)来实现文件传输,这是一种现代且高性能的技术组合,尤其适用于大规模分布式系统。 Netty是一个开源的异步事件驱动的网络应用程序框架,用于快速开发可维护的高...

    Netty中Protobuf编解码应用

    `lib`目录则可能包含了Netty和Protobuf的相关依赖库,例如netty-all.jar和protobuf-java.jar。 总的来说,Netty与Protobuf的结合提供了高效、可靠的网络通信解决方案。通过自定义的编解码器,我们能够方便地在Java...

    Netty中集成Protobuf实现Java对象数据传递示例代码.rar

    在Java世界里,Netty和Protobuf是两个非常重要的技术组件。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建高并发、低延迟的网络服务。而Protobuf(Protocol Buffers)是Google推出的一种数据序列化...

    netty+unity+proto3.rar

    java netty 服务端 + unity客户端 +protobuf3 实现网游通讯demo

    基于netty与protobuf的Android手机视频实时传输

    Netty是一个Java NIO框架,它提供了一套高度定制且易于使用的API,用于构建高性能、高并发的网络应用程序。Netty的优势在于它的事件驱动模型,通过使用Boss-Worker线程模型,能够有效地处理大量并发连接。在服务器端...

    netty http protobuf

    3. **数据传输**:HTTP协议负责将客户端发送的数据可靠地传输到服务器,而Protobuf保证了数据在传输过程中的高效编码和解码。 4. **响应处理**:服务器处理完请求后,使用Protobuf编码响应数据,再通过HTTP响应返回...

    ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化示例代码.rar

    `HelloNetty`可能是一个示例项目,展示如何在使用Netty框架的网络应用中利用ProtoBuf进行数据传输。Netty提供了ChannelHandlerContext对象的writeAndFlush()方法,可以直接将ProtoBuf序列化的字节流写入网络通道。...

Global site tag (gtag.js) - Google Analytics