C++ protobuffer 前后端通信 简单应用
后端发送多个protobuffer消息到前端,前端用socket监听,如何区分消息类型呢?
//定义心跳包
DseHeartbeat _DseHeartbeat;
DseHeartbeat _DseHeartbeat1;
_DseHeartbeat.set_time( );
char a[];
memset ( a ,,);
std::string str;
_DseHeartbeat.SerializeToString( &str );
memcpy(a,str.c_str(),str.length());
_DseHeartbeat1.ParseFromString(str);

定义了一个proto,设置int字段为当前的时间戳,可以看到被反序列化成了以上内容。
可以在string的前面添加两个字段,1个是4位的消息长度,另一个是4位的消息类型。
enum S2C_EVENT
{
C2S_DceLimitTank = , //DceLimitTank
S2C_DseUserData = , //DseUserData
S2C_DseLimitTank = ,
S2C_DseActivityData = ,
S2C_DseHeartbeat = ,
};
定义几个消息的类型。
客户端在解析的时候:
int iostring_readInt ( const char* d ,int offset ) {
int ret = ;
d += offset;
ret = (*d & 0xff) << ; d++;
ret += (*d & 0xff) << ; d++;
ret += (*d & 0xff) << ; d++;
ret += *d & 0xff;
return ret;
}
void handleData ( int size ) {
int index = ;
while (index<size) {
int headlen = sizeof ( unsigned short )+ sizeof ( unsigned int );
int len = iostring_readInt ( buf+ index );
int pkgType = iostring_readInt ( buf + index ,sizeof ( unsigned int ) );
int requireLen = len - sizeof ( unsigned int );
if (requireLen> )
{
char* response = new char[requireLen];
memcpy ( response ,buf+index + ,requireLen );
std::string str2;
str2.assign ( response ,requireLen );
switch (pkgType) {
case S2C_DseHeartbeat:
qDebug () << _DseHeartbeat.ParseFromString ( str2 );
qDebug ( ("心跳包" + std::to_string ( _DseHeartbeat.time () )).c_str () );
break;
case S2C_DseActivityData:
qDebug () << _DseActivityData.ParseFromString ( str2 );
qDebug ( ("活动:oil " + std::to_string ( _DseActivityData.oiltime () )).c_str () );
break;
case S2C_DseUserData:
qDebug () << _DseUserData.ParseFromString ( str2 );
qDebug ( ("玩家名" + _DseUserData.name () +" level:" +std::to_string ( _DseUserData.level () )).c_str () );
break;
case S2C_DseLimitTank:
_DseLimitTank.ParseFromString ( str2 );
_DropList = _DseLimitTank.maindrop ();
for (const DropData& _DropData1 : _DropList.droplist ()) {
qDebug () << (("droplist: type:" + std::to_string ( _DropData1.type () ) + " id:" + std::to_string ( _DropData1.id () ))).c_str ();
}
qDebug () << QString ( "错误码 %1" ).arg ( _DseLimitTank.res () );
default:
break;
}
}
index = index+len+;
}
}
因为客户端在recv的时候,可能一次读取多条消息,所以每次读取前四位(该消息的长度)->下四位(消息类型)->消息的内容->把消息ParseFromString 反序列化。
在这里反序列化失败过几次,因为protobuf里面还有'\0',所以,如果把char*直接赋值给string,\0会被丢弃。所以上面代码中memcpy ,assign都会保留\0。反序列化成功。
C++ protobuffer 前后端通信 简单应用的更多相关文章
- web——前后端通信原理
前端向后台传输数据: 传输方法:post get 区别: (1)get:用于从服务器获取数据,将参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看 ...
- web——前后端通信
前端向后台传输数据: 传输方法:post get 区别: (1)get:用于从服务器获取数据,将参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看 ...
- H5页面前后端通信 (3种方式简单介绍)
1.ajax:短连接 2.websocket :长连接,双向的. node搭建的websocket服务器,推送信息给客户端浏览器 :https://www.cnblogs.com/fps2tao/ ...
- express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(三)完结篇
终于完成了所有自己想要的功能(鼓励下自己),虽然还是很简陋,但是还是挺有满足感的,哈哈. 附上前两篇的链接: 第一篇 第二篇 进入正题,在第二篇里面已经完成了连接数据库,并且实现了对数据库的增删改查, ...
- WebSocket 实现前后端通信的笔记
之前在做站内信时,用到了 WebSocket ,整理了一些笔记分享如下.本文基于 SpringBoot 2.1.5,本文不涉及环境搭建. 引入依赖 在 Spring 中要使用 WebSocket 功能 ...
- 前后端通信中使用Ajax与后台接口api交互(以登录功能为例)
一.查阅开发文档 首先,要做这个功能前,我们必须先查阅后台接口文档,了解使用登录接口时,需要提交哪些参数,并且接口使用返回的数据. 这里我使用了一个返回json格式数据的登录接口为例,讲解怎么使用Aj ...
- python 前后端分离 简单的数据库返回接口
1.使用node http-server 起本地服务器 或者打开nginx 直接用nginx的默认页面也可以 (用下面的html文件替换nginx下html文件夹下的index.html) http ...
- 3-4章 第3章 form表单组件与小程序前后端通信
View它相当于是一个点击触发一个事件,但是它的事件应该是相对来说可能是比较是偏向于页面上的一些展示,或者说是页面上的一些导航的一些跳转.Button它是一个标签, button是一个标签,一般去触发 ...
- 前后端通信—webSocket(支持跨域)
WebSocket 的介绍 WebSocket 是什么 WebSocket 是一种网络通信协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 TCP ...
随机推荐
- Java学习笔记——String类型转换
一滴水里观沧海,一粒沙中看世界 ——一带一路欢迎宴致辞 上代码: package cn.stringtoobj; public class TypeConversion { public static ...
- JavaScript非构造函数的继承( object()方法、浅拷贝与深拷贝 )
一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese = { nation:'中国' }; 还有一个对象,叫做&qu ...
- 简单的scrapy实例
前天实验室的学长要求写一个简单的scrapy工程出来,之前也多少看了点scrapy的知识,但始终没有太明白,刚好趁着这个机会,加深一下对scrapy工作流程的理解.由于临近期末,很多作业要做(其实.. ...
- 🔨揭秘vue-sfc-cli: 组件研发利器
前言 本文将揭示vue单文件组件的工具 vue-sfc-cli 的内涵,说明它是如何在整个组件研发流程中提升效率的. 本文可以看成是
- 渗透测试工具SQLmap
一.简介 SQLmap 是一款用 Python 编写的开源渗透测试工具,用来自动检测和利用 SQL 注入漏洞. 二.Windows 下安装 2.1 安装 Python 环境 注:Python 3.0会 ...
- python的比较关系运算符和逻辑运算符
比较运算符 运算符 描述 示例 == 检查两个操作数的值是否相等,如果是则条件变为真. 如a=2,b=2则(a == b) 为 true. != 检查两个操作数的值是否相等,如果值不相等,则条件变为真 ...
- 法国神器"mimikatz"简化版,一键导出结果
神器之所以称之为神器.那是闹着玩的? 法国神器"mimikatz",那是相当的好使!!! GitHub:https://github.com/gentilkiwi/mimikatz ...
- PLC_SIM 出现I/O访问错误-技术论坛-工业支持中心-西门子中国
PLC_SIM 作为SIEMENS S7-300/400 系列PLC 的仿真软件,在使用时需要有些注意事项,毕竟任何的仿真软件和真正的设备还是有一定差异的,由此而产生的误会经常会令很多客户摸不着头脑, ...
- Apache struts2 namespace远程命令执行_CVE-2018-11776(S2-057)漏洞复现
Apache struts2 namespace远程命令执行_CVE-2018-11776(S2-057)漏洞复现 一.漏洞描述 S2-057漏洞产生于网站配置xml的时候,有一个namespace的 ...
- 各类最短路算法基本模板-C++
原文转自:https://blog.csdn.net/changjiale110/article/details/77394650 感谢. #define Max 0x3f3f3f3f #define ...