Netty框架中使用protocol buffer协议

        关于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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值