关于netty和protobuf的使用前面文章有说过。现在我们看看如何在netty4.0框架中使用protobuf协议。由于我们使用的是tcp协议,而tcp是基于流的方法进行传输的,若上层传了多次数据,tcp将接受的字节流放到协议栈的缓冲区中,这时候就一个问题了,到底多长的字节流是一个完整的消息对象呢?这和udp的是不一样的,udp发送的传输的就是一个完整数据包。看看官网上的关于这块的一个例子:假如tcp协议栈收到了如下3个数据包
但是在缓冲区里是流式存储的,收到的数据包可能是下面这样的
为了能接收到的数据和传输的数据包是一样就需要自己定义一套规则。我们这里就使用netty官网用的方法,将要发送的一个完整消息分为消息头header和消息体body,header指明一个完整消息的字节流大小,body中就是实际消息的字节流(消息体)。
接下来就写个例子来说明如何在netty中使用protobuf协议。先看看我的Request.proto文件:
package message;
option java_package = "message";
option java_outer_classname = "Request";
enum CommandType {
COMMAND_TYPE_REGISTER = 11;
COMMAND_TYPE_LOGIN = 12;
}
message ClientCommand {
optional CommandType commandType = 1;
extensions 10 to max;
}
LoginRequest.proto文件:
package message;
option java_package = "message";
option java_outer_classname = "LoginRequest";
import "Request.proto";
message RegisterCommand {
extend ClientCommand {
optional RegisterCommand registerCommand = 11;
}
required int32 useID = 1;
required string passWord = 2;
optional bool sex = 3;
}
message LoginCommand {
extend ClientCommand {
optional LoginCommand loginCommand = 12;
}
required int32 userID = 1;
required string passWord = 2;
}
服务器端Java代码,里面有比较详细的注释。
server端:NettyProtobufTcpServer.java
package server;
import message.LoginRequest;
import message.Request;
import com.google.protobuf.ExtensionRegistry;
import io.netty.bootstrap.Serve