在网络通讯中应用Protobuf
在网络通讯中应用Protobuf
Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf.
Protobuf提供一种简单的对象消息方式来描述数据的存储,通过相关实现可以简单地实现数据流和对象之间的转换。但由于Protobuf序列化后的信息并不包括一些相应对象类型描述,只有消息体的内容;因此在进行通信交互过程中默认情况是不知道这些数据和对象的对应关系;既然对方不清楚这些数据对应那种类型,那数据还源成对象就根本没办法入手。所以把Protobuf用到网络通讯中我们还需要外加一些协议来规范数据的对应关系。

在通讯协议上只需要在消息体中先写入类型然后再写入Protobuf数据,TypeName主要是用于对方配匹数据对应的对象关系,这个TypeName是string还是int或其他就根据自己喜好来制定了。
在通讯上问题就解决了,但还要面对实际中使用的一种情况消息太多了……那处理TypeName->Object则一个蛋痛的事情。还好在.net和android下有类元素表这玩意还能在运行行进行操作,从而可以大大节省这些if判断处理。由于本人熟悉的语言平台有限,在这里分别提供java和c#的解决方法。
- Java
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public static void Register(Class<?> protobufclass) { try { ProtoMessageHandler mb; Class<?>[] protoObjs = protobufclass.getClasses(); for (Class<?> item : protoObjs) { if(item==null) continue; if (!item.isInterface() && item.getSuperclass().equals( com.google.protobuf.GeneratedMessage.class)) { mb = new ProtoMessageHandler(); mb.SetType(item); mMessageTbl.put(item.getSimpleName(), mb); } } } catch (Exception e) { } } |
由于使用Protoc工具生成的类都会生成一个大类里,所以只需要注册指定的类然后对所有继承com.google.protobuf.GeneratedMessage的内嵌类找出来并记录在一个Map中即可。
|
1
2
3
4
5
|
String name= stream.ReadUTF(); ProtoMessageHandler handler = ProtoPackage.GetMsgHandler(name); if(handler==null) throw new Exception(name+" message type notfound!"); Message=(com.google.protobuf.GeneratedMessage) handler.GetObject(stream.GetStream()); |
以上是通过类型值获取对应的对象,并填充Protobuf数据。
- c#
相对于android平台下的实现,.net的实现就更简单些了。
|
1
2
3
4
5
6
7
8
|
public static void Register(System.Reflection.Assembly assembly) { foreach(Type type in assembly.GetTypes()) { if (!type.IsAbstract && !type.IsInterface && type.GetCustomAttributes(typeof(ProtoBuf.ProtoContractAttribute), false).Length > 0) mProtoTbl[type.Name] = type; } } |
|
1
2
3
|
string name = reader.ReadUTF(); Type type = ProtoPakcage.GetProtoType(name); Message = ProtoBuf.Meta.RuntimeTypeModel.Default.Deserialize(reader.Stream, null, type); |
通过以上方法在使用Protobuf的时候就不用担心消息太多写if写到手软了,也不容易出错。不过有一点要注意的就是类的名称一定要对应,否则就无法匹配到消息了。如果想得到完全整的代码可以到https://beetlenp.codeplex.com获取。
开源数据库访问组件
开源多台平通讯组件
c#组件设计交流群:47164588
c# socket :136485198 微博http://weibo.com/ikende
在网络通讯中应用Protobuf的更多相关文章
- 网络通讯中 bind函数的作用
面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...
- Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)
最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...
- 【咸鱼教程】protobuf在websocket通讯中的使用
教程目录一 protobuf简介二 使用protobuf三 Demo下载 参考: CSDN:Egret项目中使用protobuf(protobufjs) TS项目中使用Protobuf的解决方案(ba ...
- Linux系统网络编程中TCP通讯socket--send导致进程被关闭
https://blog.csdn.net/dsanmux/article/details/52083403 https://blog.csdn.net/u011425939/article/deta ...
- [dotnet core]使用Peach简化Socket网络通讯协议开发
Peach是基于DotNetty的Socket网络通讯帮助类库,可以帮助开发者简化使用DotNetty,关于DotNetty可参考我之前的这篇文章. Peach内置实现了一个基于文本协议的Comman ...
- 网络通讯之Socket-Tcp(二)
网络通讯之Socket-Tcp 分成2部分讲解: 网络通讯之Socket-Tcp(一): 1.如何理解Socket 2.Socket通信重要函数 3.Socket Tcp 调用的基本流程图 4.简单 ...
- 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 在Wcf中应用ProtoBuf替代默认的序列化器
Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...
- Windows 网络通讯开发
Windows 网络通讯开发 一.Windows网络开发API 由于C++标准库中没有网络库,所以进行网络开发的时候要调用系统API.Windows通讯开发API包括以下几个基本函数及成员类型: 1. ...
随机推荐
- iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释
一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...
- 2013级C++第13周(春)项目——继承的进一步话题与GUI应用开发
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读:阅读以下类的定义,请说出在 ...
- POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)
解决报告 http://blog.csdn.net/juncoder/article/details/38159017 题目传送门 题意: 看到题目我就笑了.., 老师觉得这种两个学生不是一对: 身高 ...
- HDU 5055 Bob and math problem(结构体)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5055 Problem Description Recently, Bob has been think ...
- 创建GitHub技术博客
创建GitHub技术博客全攻略 githubio技术博客网站生成 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字.本 ...
- 什么是MEAN全堆栈javascript开发框架
什么是MEAN全堆栈javascript开发框架 使用JavaScript能够完整迅速做出Web应用程序,目前一套工具包括MongoDB.ExpressJS,AngularJS和Node.js越来越受 ...
- 在 CentOS 上安装 Tomcat7
1. 下载 #可以直接在官网下载然后传到服务器上,也可以直接下载#下载地址:http://tomcat.apache.org/download-70.cgi 2. 安装 # tar -xzvf apa ...
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数
本文翻译自Elasticsearch官方指南的Proximity Matching一章. 邻近匹配(Proximity Matching) 使用了TF/IDF的标准全文搜索将文档,或者至少文档中的每一 ...
- POJ 3390 Print Words in Lines(DP)
Print Words in Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1624 Accepted: 864 D ...
- 谈谈那些年PHP中屌屌的验证码
验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码.刷票.灌水,可以有效的防止暴力破解特定用户. 现在就来了解了解那些年PHP中屌屌的验证码吧. 首先,以四位验证码为例(多位验 ...