Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf.

Protobuf提供一种简单的对象消息方式来描述数据的存储,通过相关实现可以简单地实现数据流和对象之间的转换。但由于Protobuf序列化后的信息并不包括一些相应对象类型描述,只有消息体的内容;因此在进行通信交互过程中默认情况是不知道这些数据和对象的对应关系;既然对方不清楚这些数据对应那种类型,那数据还源成对象就根本没办法入手。所以把Protobuf用到网络通讯中我们还需要外加一些协议来规范数据的对应关系。

在通讯协议上只需要在消息体中先写入类型然后再写入Protobuf数据,TypeName主要是用于对方配匹数据对应的对象关系,这个TypeName是string还是int或其他就根据自己喜好来制定了。

在通讯上问题就解决了,但还要面对实际中使用的一种情况消息太多了……那处理TypeName->Object则一个蛋痛的事情。还好在.net和android下有类元素表这玩意还能在运行行进行操作,从而可以大大节省这些if判断处理。由于本人熟悉的语言平台有限,在这里分别提供java和c#的解决方法。

  • Java
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中即可。

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的实现就更简单些了。

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;}}
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获取。

在网络通讯中应用Protobuf相关推荐

  1. 【网络通讯与网络安全】网络通讯中的随机数如果不随机会怎么样?(RT-Thread技术论坛优秀文章)

    文章目录 1 写在前言 2 问题描述 3 场景再现 3.1 复现环境搭建 3.2 复现问题的说明 4 问题分析 4.1 从大到小:理解软件架构 4.2 从小到大:抛开现象看本质 4.3 要放大招:三板 ...

  2. Beetle在Tcp通讯中使用Protobuf

    Protobuf是google制定的一种对象序列化格式,而在.net下的实现有protobuf-net.而protobuf-net在序列化方面有着出色的性能,效率是.net二进制序列化几倍,而序列化后 ...

  3. 在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址

    在编写一些程序时,为了程序可以在其他电脑上也可以使用,而不用手动去更改ip,或者碰到端口不可用的情况.在这里找到了一个好的方法,实际使用也没有问题!故此推荐给大家! 方案: 在构建网络时,使用: cl ...

  4. android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

    软件项目实训及课程设计指导--如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例 1.基于TCP/IP协议的Socket通信相关的基础知识 (1)TCP/IP(Transmissi ...

  5. java面试题32:Java网络程序设计中,下列正确的描述是()

    java面试题32:Java网络程序设计中,下列正确的描述是() A:Java网络编程API建立在Socket基础之上 B:Java网络接口只支持tcP以及其上层协议 C:Java网络接口只支持UDP ...

  6. 网络编程中的基本概念

    什么是socket? socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. Socket本身有"插座& ...

  7. Java高级篇之网络通讯

    一.了解现代流行的网络软件的基本架构 1.C/S,client/Server,客户服务器架构的软件 有专门的客户端软件,需要安装在客户电脑上,用户界面可以做得非常复杂,比如股票行情和交易软件.数据的传 ...

  8. 使用protobuf作为游戏网络通讯的协议

    使用的xml,json不是挺好的吗?为什么要用这个东西? 首先我们来了解一下protobuf这个东西吧! 要知道Protobuf是google的一个开源项目 那么他能用来干什么呢? 1.数据存储(序列 ...

  9. 网络通讯技术在嵌入式系统中的应用

    网络通讯技术在嵌入式系统中的应用 一.嵌入式系统的由来 1.1 嵌入式系统的概念:       嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能.可靠性.成本.体积.功耗.环境 ...

最新文章

  1. 关于LGame-0.2.9版的开发进度
  2. 工业用微型计算机(21)-指令系统(17)
  3. 三招助你轻松搞定超Diao氛围
  4. java+多线程菜鸟_java多线程
  5. 二月技术通讯.pdf丨核心数据库一波三折异常重启分析
  6. JDBC+Servlet+JSP整合开发之26.JSP内建对象
  7. linux令普通用户拥有root权限
  8. RTL8211E应用(一)之芯片功能介绍
  9. window 10及window7电脑前面耳机插孔没有声音,后面有声音
  10. c语言写莫迪康通信,组态王modbus通信用法教程modbus-rtu、modbus-tcp莫迪康通信配置步骤...
  11. 预测评价指标RMSE、MSE、MAE、MAPE、SMAPE
  12. 2697v3只支持服务器内存,Intel 18核心E5-2697 v4实测:虐杀桌面顶级8核i7-5960X!
  13. Win10下Windows徽标键键盘快捷键大全
  14. Shell进阶(三) 交互式脚本 函数 数组 分片 字符串处理
  15. 普及游戏:小型团队如何赢得大赛
  16. etcd http API
  17. OTTO机器人之APP蓝牙控制
  18. 自制和烧录单片机 unicode 字库芯片 - 创建字库
  19. CoolHash数据库的产品宣言(Fourinone4.0版)
  20. java websocket 微服务_微服务-springboot+websocket在线聊天室

热门文章

  1. ps怎么把一个颜色替换成另一个颜色_图标设计,用PS制作一款小清新的拟物时钟...
  2. Java学习总结:53(单对象保存父接口:Collection)
  3. Java项目:健身俱乐部管理系统(java+SSM+Mysql+Jsp)
  4. Java项目:员工管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  5. 线程使用 c语言,如何用C语言实现多线程
  6. 汉字书写解码_《汉字解码学》   第一部分
  7. 【matlab】第二次上机课
  8. 微信小程序框架封装登录,网络请求等公共模块及调用示例
  9. sql server中的hash应用优化
  10. struts2提交list