Netty集成Protobuf与多协议消息传递

一、创建Personproto.proto

创建Personproto.proto文件

syntax = "proto2";

package com.example.protobuf;

option optimize_for = SPEED;
option java_package = "com.example.sixthexample";
option java_outer_classname = "MyDataInfo";

message Person{
    required string name = 1;
    optional int32 age = 2;
    optional string address = 3;

}

  

2、重新生成

D:\workspace\study\basic\netty_demo>protoc --java_out=src/main/java  src/protobuf/Person.proto

二、创建Netty服务端代码

1、TestServer 类

public class TestServer {

    public static void main(String[] args) throws  Exception{
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try{

            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
                    .handler(new LoggingHandler(LogLevel.INFO)) //增加日志处理器
                    .childHandler(new TestServerInitializer());

            ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
            channelFuture.channel().closeFuture().sync();
        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

  

2、TestServerHandle类

public class TestServerHandle extends SimpleChannelInboundHandler<MyDataInfo.Person> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MyDataInfo.Person msg) throws Exception {
        System.out.println("---- 服务端接收到消息 ----");
        System.out.println(msg.getName());
        System.out.println(msg.getAge());
        System.out.println(msg.getAddress());
    }
}

  

3、TestServerInitializer 类

public class TestServerInitializer extends ChannelInitializer<SocketChannel>{

    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();
        pipeline.addLast(new ProtobufVarint32FrameDecoder());
        pipeline.addLast(new ProtobufDecoder(MyDataInfo.Person.getDefaultInstance()));
        pipeline.addLast(new ProtobufVarint32LengthFieldPrepender());
        pipeline.addLast(new ProtobufEncoder());

        pipeline.addLast(new TestServerHandle());
    }
}

  

三、创建客户端代码

1、TestClient 类

public class TestClient {

    public static void main(String[] args) throws  Exception{
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class)
                    .handler(new TestClientInitializer());

            ChannelFuture channelFuture = bootstrap.connect("localhost",8899).sync();
            channelFuture.channel().closeFuture().sync();

        }finally {
            eventLoopGroup.shutdownGracefully();
        }
    }
}

  

2、TestClientHandle 类

public class TestClientHandle extends SimpleChannelInboundHandler<MyDataInfo.Person> {

    // 对于客户端来说,输入来自控制台
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, MyDataInfo.Person msg) throws Exception {

    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //客户端启动后,将消息发送给服务端
        MyDataInfo.Person person = MyDataInfo.Person.newBuilder()
                 .setName("张三").setAge(30).setAddress("上海").build();
         ctx.channel().writeAndFlush(person);
    }
}

  

3、TestClientInitializer 类

public class TestClientInitializer extends ChannelInitializer<SocketChannel> {

    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new ProtobufVarint32FrameDecoder());
        pipeline.addLast(new ProtobufDecoder(MyDataInfo.Person.getDefaultInstance()));
        pipeline.addLast(new ProtobufVarint32LengthFieldPrepender());
        pipeline.addLast(new ProtobufEncoder());
        pipeline.addLast(new TestClientHandle());
    }
}

  

四、测试

1、启动服务端

2、启动客户端

3、服务端输出

原文地址:https://www.cnblogs.com/linlf03/p/11332765.html

时间: 2024-10-30 00:36:52

Netty集成Protobuf与多协议消息传递的相关文章

Netty对Protocol Buffer多协议的支持(八)

Netty对Protocol Buffer多协议的支持(八) 一.背景 在上篇博文中笔者已经用代码演示了如何在netty中使用Protocol Buffer,然而细心的用户可能会发现一个明显的不足之处就是,我们的Handler只能处理一种特定的类型,而我们的项目中又不可能只有一种类型,那么这个问题该怎么解决了?多的不说,笔者直接上代码. 二.代码实现 2.1 message的编写 syntax = "proto2"; package com.rsy.netty.protobuf; op

cocos2dx 3.8.1 lua集成protobuf

目前lua集成protobuf主要有两种方式 1. protobuf-gen-lua方案 https://github.com/sean-lin/protoc-gen-lua  参照说明即可集成 这个方案是将proto文件导出成lua文件, 使用起来稍微麻烦,  不能直接创建lua table,  而是要用生成lua pb文件中指定格式的table来生成二进制,  同样服务器返回的二进制数据也是反序列化成生成lua pb文件中指定格式的table. 对数组的操作与lua原生方式不一样, 没有良好

netty 对 protobuf 协议的解码与包装探究(2)

netty 默认支持protobuf 的封装与解码,如果通信双方都使用netty则没有什么障碍,但如果客户端是其它语言(C#)则需要自己仿写与netty一致的方式(解码+封装),提前是必须很了解netty是如何进行封装与解码的.这里主要通过读源码主要类ProtobufVarint32FrameDecoder(解码)+ProtobufVarint32LengthFieldPrepender(封装) 来解析其原理与实现. 文章来源http://www.cnblogs.com/tankaixiong

Netty with protobuf(二)

上一篇了解了protobuf,现在结合netty做一个例子. 关键就是配置netty的编解码器,因为netty提供了protobuf的编解码器,所以我们可以很容易的使用netty提供的编解码器使用protobuf数据交换协议进行通信.. 下面是示例代码,对于了解的netty的同学应该不难看懂.. 服务器端程序: ProtobufNettyServer.java package com.example.tutorial; import io.netty.bootstrap.ServerBootst

Netty学习——Netty和Protobuf的整合(一)

Netty学习——Netty和Protobuf的整合 Protobuf作为序列化的工具,将序列化后的数据,通过Netty来进行在网络上的传输 1.将proto文件里的java包的位置修改一下,然后再执行一下protoc 异常捕获:启动服务器端正常,在启动客户端的时候,发送消息,报错 警告: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the l

iOS 集成Protobuf,转换proto文件

原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-cn.html Protobuf简介 Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0.它独立于语言,独立于平台.google 提供了多种语言的实现:Java.C#.C++.Go 和 Python,Objective-C,每一种实现都

Netty Protobuf C# 通信

1.目的 最近一个游戏开发需要使用Netty 和 Protobuf,之前使用的thift(https://thrift.apache.org/),然后找了一下Netty.protobuf的开发资料,网上千篇一律的都是照搬官方的LocaleTime Demo.我只能说Demo就是Demo,在真正游戏开发中能用吗? 在这里,我把自己实现的.测试通过的.有效的方式提供给大家,包括源代码,提供给开始尝试使用Netty 和 protobuf技术,但是却有点迷糊的同学.当然如果你是高手,也可以优化和提出改造

一起学Netty(十)之 Netty使用Google的ProtoBuf

protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式,等等.其特点是不限语言.不限平台.扩展性强 Netty也提供了对Protobuf的天然支持,我们今天就写一个简单的示例,简单地了解一下Netty对Google的protoBuf的支持 我们的示例场景很简单的:客户端发送一个信息,这个信息用Protobuf来做序列化,然后服务器端接收这个信息,解码,读取信息 protobuf与xml,json这样的数据格式一样,都有自己的一套语法,且语法很简单,很容

Http 调用netty 服务,服务调用客户端,伪同步响应.ProtoBuf 解决粘包,半包问题.

实际情况是: 公司需要开发一个接口给新产品使用,需求如下 1.有一款硬件设备,客户用usb接上电脑就可以,但是此设备功能比较单一,所以开发一个服务器程序,辅助此设备业务功能 2.解决方案,使用Socket调用此设备 3.增强此设备功能,增加Socket客户端连接到Socket服务端 4.Http请求,同步响应 测试注意: 1.nettyServer 在ubuntu下编码,使用Epoll 2.Http请求的测试最好运行再Linux 下进行,因为Windows 可能会因为并发高的时候占满端口限制,H