准备工具:

工具下载地址如下: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定义网络协议相关推荐

  1. 深度学习深度前馈网络_深度学习前馈网络中的讲义第4部分

    深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...

  2. xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习

    一.美系厂家Rockwell ABRockwell的PLC主要是包括:PLC2.PLC3.PLC5.SLC500.ControlLogix等型号,PLC2和PLC3是早期型号,现在用的比较多的小型PL ...

  3. linux java socket编程_深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  4. java中jsoup编译网络_使用jsoup获取网络数据

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出 ...

  5. java任亮_任亮的网络课堂,任亮 Java,Oracle,MySQL,Android,JavaScript,jQuery 大讲堂 - 51CTO学院高级讲师...

    讲师职称 多年实战开发经验,资深软件架构师, WEB技术领域专业人士,多个项目主持者,高级讲师 擅长领域 Java.Oracle. MySql,Freemarker,Struts.Hibernate. ...

  6. anylogic中如何构建复杂网络_如何对复杂网络建模所需要的数据进行预处理

    上一篇文章介绍了如何构建Space L实体网络的模型,这一篇是对上一篇文章的一个补充优化. 以下部分摘自上一篇文章: 邢八宝:如何建立复杂网络实体网络的Space L模型?​zhuanlan.zhih ...

  7. javascript网络_没有JavaScript的网络外观

    javascript网络 A Berlin-based web developer - who codes JavaScript for a living - decided to go an ent ...

  8. win10无法连接到这个网络_电脑无法连接网络怎么办?(有线网络篇)

    哈喽!各位小伙伴大家好呀! 好久不见,近期真的太多小伙伴咨询网络问题了, 没办法,虽然以前写过相关文章, 断网.网络卡.慢.掉线的常规解决方法 不过可能还不够细致, 本篇就尽量把所有的问题都提出解决的 ...

  9. docker 网络_初探Docker的网络模式

    xiaohang 一个写不好代码的年轻人 钢铁侠的铁杆粉丝:I am Iron Man! 刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢? 今天我们就一起来认识一下docker的网络吧~ ...

最新文章

  1. 暑期集训3:几何基础 练习题G: HDU - 1052
  2. 修改python编码
  3. 从寻找可敬的人类开始,扩展未来人类生存的8个维度
  4. C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件
  5. 关于XML文档操作类
  6. SON_EXAM考试php,通用全国少儿英语等级考试:三星笔试真题
  7. Python以字符形式打印双色图片中的文字
  8. 电商知识图谱的构建及搜索推荐场景下的应用实践
  9. 错误因为数据库正在使用,所以无法获得对数据库的独占访问权的解决方案(转)...
  10. 声鉴卡HTML5网页源码
  11. 阿文PPT教程视频课程2019送PPT模板 我懂个P
  12. 17229 Lry,你除了2还是2
  13. 修改网页标题前面的logo
  14. react 复制antd表格行
  15. pbr发光 unity_Unity PBR—BRDF
  16. java---File类笔记(简单介绍)
  17. 第17课:强化学习的模型训练
  18. Async 异步转同步
  19. 小布助手,身入大千世界
  20. jQuery事件 笔记

热门文章

  1. 基于OpenCV Haar实战级联分类器的使用
  2. 用Genymotion来调试android应用
  3. 邮件客户端WebMail Pro v7.7.5发布,在线订购限时75折优惠!
  4. 阿里云首席架构师唐洪:拥抱开源的云端更具生命力
  5. [Python]urllib库的简单应用-实现北航宿舍自动上网
  6. Activiti 笔记
  7. 软件定义的数据中心-【软件和信息服务】2012.11
  8. cmd命令控制台窗口一闪就消失解决办法
  9. HP服务器选型一般标准
  10. CString的用法