netty4与protocol buffer结合简易教程

各项目之间通常使用二进制进行通讯,占用带宽小、处理速度快~

感谢netty作者Trustin Lee,让netty天生支持protocol buffer。

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

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

2、到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();
}
}
}


入门教程,欢迎拍砖。

推荐其他参考教程:protocol与netty结合的资料http://blog.csdn.net/goldenfish1919/article/details/6719276

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Protocol Buffer是一种语言无关、平台无关、可扩展的序列化机制,它可以用于在不同的应用程序间进行数据传输和存储。要将Protocol Buffer架设服务器并接入Unity,可以按照以下步骤进行操作: 1. 首先,需要在服务器端设置一个网络监听服务,用于接收客户端(Unity)的请求。可以使用常见的网络编程框架,如Python的Twisted、JavaNetty或C#的.Net Socket等。 2. 为了在服务器与客户端之间进行数据传输,需要创建一个共享的Protocol Buffer消息定义文件(.proto文件)。该文件应该能够描述服务器和客户端之间通信的数据结构和消息格式。 3. 在服务器端,根据之前定义的.proto文件,使用Protocol Buffer编译器生成相应的代码(如C#、Java或Python),以便在服务器端进行数据的序列化和反序列化。 4. 在服务器端的代码中,通过网络监听服务接收到来自Unity客户端的数据。将这些数据反序列化为Protocol Buffer消息,进行服务器端的逻辑处理,并根据需要对数据进行处理(如存储到数据库、发送给其他客户端等)。 5. 在Unity中,同样需要使用Protocol Buffer编译器生成相应的代码(如C#),以便在Unity客户端进行数据的序列化和反序列化。 6. 在Unity中,可以根据需要创建消息对象,将这些对象序列化为Protocol Buffer消息,并通过网络连接向服务器发送数据。 7. 在Unity中,可以使用网络库(如UnityWebRequest)来接收服务器返回的数据。将接收到的数据反序列化为Protocol Buffer消息,在Unity客户端中进行处理和展示。 总结起来,要将Protocol Buffer架设服务器并接入Unity,主要的步骤包括设置服务器的网络监听服务、定义共享的Protocol Buffer消息格式、在服务器和Unity中生成相应的Protocol Buffer代码、进行数据的序列化和反序列化操作,以实现服务器与Unity客户端之间的数据传输和通信。 ### 回答2: 要在Unity中接入Protocol Buffer架设服务器,你可以按照以下步骤进行操作: 1. 首先,你需要安装Protocol Buffer的插件和库。你可以在Protocol Buffer的官方网站上下载并安装适用于你使用的操作系统的插件。 2. 在Unity中创建一个新的脚本来处理与服务器之间的通信。你可以使用Unity提供的网络功能(如 WebClient、HttpWebRequest 等)或者使用第三方库来处理网络通信。 3. 在你的Unity项目中创建一个.proto文件,该文件定义了你与服务器之间的数据通信格式。你可以使用Protocol Buffer的语法来定义消息和服务。 4. 使用Protocol Buffer的编译器将.proto文件编译成适用于C#的类。编译器会生成相应的C#类用于序列化和反序列化数据。 5. 在服务器端,你需要使用Protocol Buffer的库来处理从Unity发送过来的请求和响应。你可以使用适用于你的服务器端语言的库来处理。 6. 在Unity中,你可以使用C#生成的类来编码和解码Protocol Buffer消息。你可以将数据从Unity发送到服务器,并将服务器的响应数据解析回Unity中进行处理。 7. 最后,你可以在Unity中使用接收到的数据进行游戏逻辑处理,例如更新游戏状态、显示信息等。 总之,通过以上步骤,你可以在Unity中使用Protocol Buffer架设服务器,并且通过定义好的消息格式进行通信。这样,你就能够实现与服务器的数据交互和游戏逻辑处理。 ### 回答3: 要在Unity中接入Protocol Buffer(PB)架设的服务器,需要进行以下步骤: 1. 首先,确保已安装Protocol Buffer编译器(protoc)和相关的插件。可以从Protocol Buffer官方网站下载适用于所需平台的编译器和插件。 2. 在服务器端,使用Protocol Buffer定义文件(.proto文件)定义数据结构和通信协议。在该文件中,声明消息类型、字段和可选的选项。使用Protocol Buffer的语法为服务器和客户端定义相同的消息类型。 3. 使用protoc编译器将.proto文件编译成相应语言的文件(如C#)生成代码。 4. 在服务器端,使用编译生成的代码实现服务。服务器端应用程序可以使用Socket或其他网络通信库来实现网络连接和消息传输。将编码的PB消息从服务器发送到Unity客户端。 5. 在Unity中,与服务器进行通信的客户端代码中,也需要使用相同的.proto文件来生成相应的PB消息类。将从服务器接收到的编码消息解码成PB消息对象。 6. 在Unity中,可以使用解码后的PB消息对象进行相关逻辑的处理。根据接收到的消息类型,执行相应的操作。 7. 在Unity中,将需要发送给服务器的消息编码成PB消息对象,并通过网络发送给服务器。 通过以上步骤,就可以在Unity中接入Protocol Buffer架设的服务器,并进行数据的传输和处理。请注意,需要确保服务器和Unity客户端使用的是相同的.proto文件和相应生成的PB代码,以便正确解析和处理消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值