`
liyonghui160com
  • 浏览: 771834 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

netty4+protobuf

阅读更多

 

http://hbxflihua.iteye.com/blog/2231878

 

本实例使用netty4+protobuf-2.5.0,在win7下执行,并且假设已经安装jdk和maven。

1、下载Protobuf的Windows版,网址如下:https://developers.google.com/protocol-buffers/docs/downloads?hl=zh-cn,本示例基于protoc-2.6.1-win32.zip

    2、下载Protobuf Java语言所需的jar包,网址如下:http://repo2.maven.org/maven2/com/google/protobuf/protobuf-java/2.6.1/,本示例基于protobuf-java-2.6.1.jar

下载并解压protoc-2.5.0-win32.zip和protobuf-2.5.0.zip

到protobuf-2.5.0.zip安装目录protobuf-2.5.0\Java下,执行maven命令:mvn package jar:jar,将生成target\protobuf-java-2.5.0.jar

3、定义proto文件test.proto:

package domain;

option java_package = "com.server.domain";

message TestPro {
  required string test = 1;
}

4、将第2部的jar包拷贝到java文件存放目录下,然后运行下面命令,生成java文件:

protoc-2.5.0-win32.zip安装目录\protoc.exe --java_out=java文件存放目录 proto定义文件目录\test.proto

5、将生成的protobuf-java-2.5.0.jar和netty4的jar包放到项目的classpath中,并将第4部生成的java文件放到项目的相应路径下。

6、编写Server端代码

1)、编写handler类:

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class ServerHandler extends SimpleChannelInboundHandler<Test.TestPro> {
@Override
public void channelRead0(ChannelHandlerContext ctx, Test.TestPro msg) throws Exception {
System.out.println("server:" + "channelRead:" + msg.getTest());

Test.TestPro.Builder builder = Test.TestPro.newBuilder();
builder.setTest("Received your message !");
ctx.writeAndFlush(builder.build());
}
}

2)、注册服务,绑定端口:

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.protobuf.ProtobufDecoder;
import io.netty.handler.codec.protobuf.ProtobufEncoder;

public class Server {

public static void main(String[] args) {
EventLoopGroup bossEventLoopGroup = new NioEventLoopGroup();
EventLoopGroup workerEventLoopGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossEventLoopGroup, workerEventLoopGroup);
serverBootstrap.channel(NioServerSocketChannel.class);
serverBootstrap.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast("encoder", new ProtobufEncoder());
ch.pipeline().addLast("decoder", new ProtobufDecoder(Test.TestPro.getDefaultInstance()));
ch.pipeline().addLast("handler", new ServerHandler());
};
});
serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
bossEventLoopGroup.shutdownGracefully();
workerEventLoopGroup.shutdownGracefully();
}
}
}

7、编写Client端代码

1)、定义Client端的handler类:

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class ClientHandler extends SimpleChannelInboundHandler<Test.TestPro> {

@Override
protected void channelRead0(ChannelHandlerContext ctx, Test.TestPro msg) throws Exception {
System.out.println("client:" + "channelRead:" + msg.getTest());
}
}

2)、建立Client端到Server端的连接

import java.io.BufferedReader;
import java.io.InputStreamReader;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.protobuf.ProtobufDecoder;
import io.netty.handler.codec.protobuf.ProtobufEncoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class Client {

public static void main(String[] args) {
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(eventLoopGroup);
bootstrap.channel(NioSocketChannel.class);
bootstrap.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast("encoder", new ProtobufEncoder());
ch.pipeline().addLast("decoder", new ProtobufDecoder(Test.TestPro.getDefaultInstance()));
ch.pipeline().addLast("handler", new ClientHandler());
};
});

Channel ch = bootstrap.connect("127.0.0.1", 8888).sync().channel();

// 控制台输入
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for (;;) {
String line = in.readLine();
if (line == null || "".equals(line)) {
continue;
}
Test.TestPro.Builder builder = Test.TestPro.newBuilder();
builder.setTest(line);
ch.writeAndFlush(builder.build());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
eventLoopGroup.shutdownGracefully();
}
}
}

 

 

 http://hbxflihua.iteye.com/blog/2231878

 

分享到:
评论

相关推荐

    Netty4+ProtoBuf通信框架

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

    netty+protobuf (整合源代码)

    在《netty+protobuf 整合实战》中,作者通过实际的源代码展示了如何将这两个技术结合使用。首先,我们需要理解 Protobuf 的工作原理。 Protobuf 提供了语言无关的 .proto 文件来定义数据结构,然后通过 protoc ...

    基于Netty+Redis+protobuf开发的即时通讯服务器

    基于Netty+Redis+protobuf开发的即时通讯服务器 第一版是一个简版,只实现了很少的功能,现在已经迁移到 [v1.0](https://github.com/linyu19872008/cdeer-im/tree/v1.0) 第二版的目标有以下几点: 1 工程用...

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

    4. 创建Netty Server:编写Netty服务器端代码,使用protobuf的Decoder和Encoder处理进来的数据流。 5. 实现业务逻辑:在服务端和客户端的业务代码中,使用protobuf生成的Java类进行数据操作。 6. 测试通信:编写...

    netty+protobuf入门案例

    4. **编写业务逻辑**:在处理器中,你可以使用 Protobuf 生成的 Java 类进行数据操作。比如,接收一个 `Person` 消息,处理后发送另一个 `Person` 消息。 5. **配置 ServerBootstrap**:配置 Netty 的 `...

    基于Netty+TCP+Protobuf实现的Android IM库

    基于Netty+TCP+Protobuf实现的Android IM库,包含Protobuf序列化、TCP拆包与粘包、长连接握手认证、心跳机制、断线重连机制、消息重发机制、读写超时机制、离线消息、线程池等功能

    Netty+自定义Protobuf编解码器

    综上所述,"Netty+自定义Protobuf编解码器"的主题涉及到如何在Netty框架下创建一个能够处理多种protobuf消息类型的编解码器,这将极大地增强网络通信的灵活性。通过自定义编解码器,我们可以根据实际需求发送和接收...

    基于Netty+Redis+protobuf开发的即时通讯服务器.zip

    本项目"基于Netty+Redis+protobuf开发的即时通讯服务器"利用了三种技术:Netty作为网络通信库,Redis作为数据缓存与消息中间件,以及protobuf作为序列化协议,实现了高性能的实时通信解决方案。 首先,Netty是一个...

    netty+protobuf开发一个聊天室实例

    在本文中,我们将深入探讨如何使用Netty和Protobuf来开发一个实时聊天室实例。Netty是一个高性能、异步事件驱动的网络应用框架,适用于Java平台,它简化了TCP、UDP和HTTP等协议的服务器和客户端应用开发。而Protobuf...

    通信与协议Netty+Protobuf-游戏设计与开发(1)配套代码

    4. **版本兼容性**: Protobuf支持版本升级,旧的客户端仍能理解新版本的消息格式。 在本资源中,"NettyProtobufTcpServer"是使用Netty实现的TCP服务器,它负责接收客户端的连接并处理基于Protobuf编码的数据。TCP...

    netty+protobuf入门案例.

    Netty和Protobuf是两种在IT领域中广泛使用的开源技术,尤其在开发高效、高性能的网络应用程序时。本文将深入探讨这两个技术,并结合一个入门案例,帮助初学者理解如何将它们结合起来使用。 Netty是一个高性能、异步...

    netty+unity+proto3.rar

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

    cdeer-im, 基于Netty+Redis+protobuf开发的即时通讯服务器.zip

    在本文中,我们将深入探讨一个名为“cdeer-im”的开源项目,它是一个基于Netty、Redis和protobuf技术栈构建的IM服务器。 **Netty详解** Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于开发可维护的高...

    android netty cli +probuf示例

    在Android平台上实现即时通讯功能,Netty和Protobuf(Protocol Buffers)的结合是一个高效、可靠的解决方案。本文将深入探讨如何使用这两个技术构建一个客户端应用程序。 Netty是Java领域的一款高性能、异步事件...

    采用netty与protobuf进行文件传输

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

    Unity与Netty进行ProtoBuf通信__

    4. **设置Unity与Netty通信**:在Unity客户端,你需要创建一个WebSocket或TCP连接到运行Netty的服务器。发送数据时,先序列化对象,然后通过连接发送序列化后的字节数组。在服务器端,Netty将接收到这些字节,反序列...

    毕设项目:基于netty+websocket+springboot的实时聊天系统.zip

    这是一个基于Netty、WebSocket和Spring Boot技术实现的实时聊天系统的毕设项目,下面将详细介绍这个项目的相关知识点。 首先,我们来了解一下Spring Boot。Spring Boot是由Pivotal团队提供的全新框架,其设计目标是...

    spring boot +maven+ netty4+protostuff+zookeeper实现一个轻量级RPC框架

    Netty:它使 NIO 编程更加容易,屏蔽了 Java 底层的 NIO 细节。 Protostuff:它基于 Protobuf 序列化框架,面向 POJO,无需编写 .proto 文件。 ZooKeeper:提供服务注册与发现功能,开发分布式系统的必备选择,同时...

    Netty中Protobuf编解码应用

    在Netty中, Protobuf(Protocol Buffers)是一种高效的序列化协议,由Google开发,用于数据交换。它提供了一种结构化数据的序列化方法,类似于XML、JSON,但更小、更快、更简单。Protobuf编解码器在Netty中的应用,...

Global site tag (gtag.js) - Google Analytics