java protobuffer 网络_使用Protobuf定义网络协议
准备工具:
工具下载地址如下:https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1,主要使用到的文件有:
protoc.exe工具:通过此工具将从自定义的协议文件(.proto)得到相应(.java)的Java类文件;
对应proto.exe版本的protobuf-java.jar包,用于解析上面得到的.java类,这里我使用的是2.5.0版本的protobuf;
chat_send.proto协议文件,关于proto协议文件的书写语法详细的可以查看:Protobuf语言指南,chat_send.proto内容如下(包名package可以根据当前服务器应用的包名进行修改):
//定义使用的protobuf版本
syntax = "proto2";
//定义所在的protobuf包空间
package ares.logic.msg.proto;
//生成的java类所在的包路径
option java_package = "ares.logic.msg.proto";
//生成的java类的类名
option java_outer_classname = "ChatSendMsg";
//声明一个message类
message ChatSend{ //(5)
optional int32 mid = 1; // 消息ID, 非必要
required int64 playerid = 3; // 游戏角色ID 必要
required int32 userid = 4; // 用户ID, 必要
required int32 power = 5; // 角色战力值(如果没有可设置为角色等级)
required int32 channel = 6; //消息频道 必要
required string content = 7; //聊天内容 必要
required string playername = 8; // 游戏昵称 必要
required int32 zeusid = 9; // 区服ID 必要
required string ip = 10; // 当前发言人的IP 必要
optional int32 banned = 11; // 是否禁言
cs_enum.proto协议类型枚举文件,用于列举所有协议数据结构的编号:
syntax = "proto2";
//定义所在的protobuf包空间
package ares.logic.msg.proto;
//生成的java类所在的包路径
option java_package = "ares.logic.msg.proto";
//生成的java类的类名
option java_outer_classname = "EnmMsgId";
enum EnmCmdId
{
UNIVERSAL = 0;
ChatSend = 1001;//登录请求协议号
}
将.proto转化为Java类文件的处理脚本,这里其实只是一句命令行指令:
protoc chat_send.proto --java_out=../src/
这里我根据实际项目目录结构定义了一个转文件的.bat批处理文件:
echo on
call protoc --version
call protoc chat_send.proto --java_out=../src/
call protoc cs_enum.proto --java_out=../src/
PAUSE
protobuf数据通信过程:
1.客户端创建数据:
要构建一个protobuf数据,需要通过对应协议文件的数据结构,先通过每个数据类型的newBuilder()方法来创建对应的Builder对象,再对Builder中的属性进行赋值,最后才能使用Builder来build()数据对象
public ChatSend getProtobuf() {
ChatSend.Builder chatBuilder = ChatSend.newBuilder();
chatBuilder.setMid(EnmCmdId.ChatSend.getNumber());
chatBuilder.setPlayerid(roleId);
chatBuilder.setBanned(banned);
chatBuilder.setChannel(channel);
chatBuilder.setContent(content);
chatBuilder.setIp(loginIp);
chatBuilder.setPlayername(roleName);
chatBuilder.setPower(level);
chatBuilder.setUserid(userId);
chatBuilder.setZeusid(serverId);
return chatBuilder.build();
}
客户端单独启用一个线程,将请求的消息发送给服务器
private void initThread() {
BlockingThreadPool.createThreads(BlockingThreadPool.SkyEye_CHECKER, 1, new SocketHandler());
}
private class SocketHandler implements BlockingThreadPool.Callbacker {
private boolean retry;
@Override
public void callback(SkyEyeMsg info) {
byte[] data = info.getProtobuf().toByteArray();
try {
if (socket == null) {
initSocket();
}
byte[] len = intToByteArray(data.length);
socket.getOutputStream().write(HEAD);
socket.getOutputStream().write(len);
socket.getOutputStream().write(data);
} catch (Exception e) {
closeSocket(); //socket重连
if(retry){
SkyEyeChecker.logger.error("ckeckMsg Exception :" + e);
}else{
retry = true;
callback(info);
retry = false;
}
}
}
byte[] intToByteArray(int len) {
byte[] data = new byte[4];
data[0] = (byte) (len >> 24);
data[1] = (byte) (len >> 16);
data[2] = (byte) (len >> 8);
data[3] = (byte) len;
return data;
}
}
java protobuffer 网络_使用Protobuf定义网络协议相关推荐
- 深度学习深度前馈网络_深度学习前馈网络中的讲义第4部分
深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...
- xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习
一.美系厂家Rockwell ABRockwell的PLC主要是包括:PLC2.PLC3.PLC5.SLC500.ControlLogix等型号,PLC2和PLC3是早期型号,现在用的比较多的小型PL ...
- linux java socket编程_深入学习socket网络编程,以java语言为例
了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...
- java中jsoup编译网络_使用jsoup获取网络数据
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出 ...
- java任亮_任亮的网络课堂,任亮 Java,Oracle,MySQL,Android,JavaScript,jQuery 大讲堂 - 51CTO学院高级讲师...
讲师职称 多年实战开发经验,资深软件架构师, WEB技术领域专业人士,多个项目主持者,高级讲师 擅长领域 Java.Oracle. MySql,Freemarker,Struts.Hibernate. ...
- anylogic中如何构建复杂网络_如何对复杂网络建模所需要的数据进行预处理
上一篇文章介绍了如何构建Space L实体网络的模型,这一篇是对上一篇文章的一个补充优化. 以下部分摘自上一篇文章: 邢八宝:如何建立复杂网络实体网络的Space L模型?zhuanlan.zhih ...
- javascript网络_没有JavaScript的网络外观
javascript网络 A Berlin-based web developer - who codes JavaScript for a living - decided to go an ent ...
- win10无法连接到这个网络_电脑无法连接网络怎么办?(有线网络篇)
哈喽!各位小伙伴大家好呀! 好久不见,近期真的太多小伙伴咨询网络问题了, 没办法,虽然以前写过相关文章, 断网.网络卡.慢.掉线的常规解决方法 不过可能还不够细致, 本篇就尽量把所有的问题都提出解决的 ...
- docker 网络_初探Docker的网络模式
xiaohang 一个写不好代码的年轻人 钢铁侠的铁杆粉丝:I am Iron Man! 刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢? 今天我们就一起来认识一下docker的网络吧~ ...
最新文章
- 暑期集训3:几何基础 练习题G: HDU - 1052
- 修改python编码
- 从寻找可敬的人类开始,扩展未来人类生存的8个维度
- C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件
- 关于XML文档操作类
- SON_EXAM考试php,通用全国少儿英语等级考试:三星笔试真题
- Python以字符形式打印双色图片中的文字
- 电商知识图谱的构建及搜索推荐场景下的应用实践
- 错误因为数据库正在使用,所以无法获得对数据库的独占访问权的解决方案(转)...
- 声鉴卡HTML5网页源码
- 阿文PPT教程视频课程2019送PPT模板 我懂个P
- 17229 Lry,你除了2还是2
- 修改网页标题前面的logo
- react 复制antd表格行
- pbr发光 unity_Unity PBR—BRDF
- java---File类笔记(简单介绍)
- 第17课:强化学习的模型训练
- Async 异步转同步
- 小布助手,身入大千世界
- jQuery事件 笔记