对于客户端和服务端的数据传输通常会有以下几点考虑:

1.网络数据大小——占用带宽,传输效率:虽然对单个用户来说,数据量传输很小,但是对于服务器端要承受众多的高并发数据传输,必须要考虑到数据占用带宽,尽量不要有冗余数据,这样才能够少占用带宽,少占用资源,少网络IO,提高传输效率;
2.网络数据安全性——敏感数据的网络安全:对于相关业务的部分数据传输都是敏感数据,所以必须考虑对部分传输数据进行加密;
3.编码复杂度——序列化和反序列化复杂度,效率,数据结构的可扩展性,可维护性:对于平台相关业务的代码实现也需要考虑到数据发送方和数据接收方数据处理的复杂度和数据结构的可扩展性,可维护性,人力成本和实施复杂度也必须考虑在内;
4.协议通用性——大众规范:数据类型必须是跨平台,数据格式是通用的,大家普遍能接受上手的;

以下我们通过几种不同类别的协议数据类型进行比较:
自定义二进制                
优点:信息体积小,对应以上”1“              
缺点:编码复杂度高(自己定义消息格式,自己编写序列化和反序列化方法,自己进行容错处理,可扩展性不强,比如添加个字段,就必须改两端的逻辑处理),对应以上”3“;

提供序列化和反序列化库的开源协议
比如protocol buffers, json,  Thrift
优点:是一种流行的通用数据格式,扩展相当方便,序列化和反序列化相当方便(有相应库),错误处理方便(库支持);
文本化协议
比如xml,json
优点:序列化,反序列化容易(库支持),调试方便,可视化强
缺点:相对于二进制存储占用体积大


如果是你,你会选择哪种协议?
我会选择json,因为他是“提供序列化和反序列化库的开源协议还是文本化的协议”,原因如下:
1.自定义二进制格式进行传输的工作,整个过程在定义消息,write,read的过程过于复杂,还很容易出错,对于很多数据交互的程序,会花费大量的时间在上面;
2.自定义二进制格式不便于扩展,但json可以很好地解决这种问题;
3.虽然相比较二进制,json的占用空间稍大,但是我们可以通过网络数据压缩来解决,况且json本身也是轻量级的,传输效率也很高;
4.去看《unix编程艺术》吧,第5章--文本化,好协议产生好实践;第6章--透明性:来点儿光 会告诉你使用文本化协议的好处;

转载于:https://blog.51cto.com/yaocoder/995210

网络传输数据格式的选择相关推荐

  1. 一种简易网络传输数据格式【替代json/xml】

    网络传输数据格式可有多种选择,主要可分为三种: 1.自定义二进制: 2.提供序列化和反序列化库的开源协议[如protocol buffers,json,Thrift]: 3.文本化协议[如json,x ...

  2. Java DICOM 网络传输_DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store

    背景: 上一篇博文对DICOM中的网络传输进行了介绍,主要参照DCMTK Wiki中的英文原文.通过对比DCMTK与fo-dicom两个开源库对DICOM标准的具体实现,对理解DICOM标准有一个更直 ...

  3. DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store

    背景: 上一篇博文对DICOM中的网络传输进行了介绍,主要参照DCMTK Wiki中的英文原文.通过对比DCMTK与fo-dicom两个开源库对DICOM标准的具体实现,对理解DICOM标准有一个更直 ...

  4. Android 实现无网络传输文件(2)

    在我的上一篇文章:Android 实现无网络传输文件,我介绍了通过 Wifi Direct(Wifi 直连)实现 Android 设备之间进行文件传输的方法,可以在无移动网络的情况下实现点对点的文件传 ...

  5. 解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  6. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  7. python opencv 图像网络传输

    本代码主要实现的是利用网络传输图片,用在我的树莓派项目之上.该项目在PC上运行服务端,树莓派上运行客户端,两者连接到同一局域网中,修改代码中的IP地址,就可以实现将树莓派采集到的图像数据实时传输到PC ...

  8. 【内网安全】域横向网络传输应用层隧道技术

    必备知识点: 1.代理和隧道技术区别? 代理只是为了解决网络通信问题,有些内网访问不到,可以用代理实现 隧道不仅是解决网络的通信问题,同时更大的作用是被防火墙甚至入侵检测系统进行拦截的东西的突破. 2 ...

  9. Hobbit玩转Zynq MPSoC系列之2:TPG输入+VCU编码+rtp网络传输

    Xilinx官方提供了TPG.MIPI.SDI.HDMI和FILE等接口作为图像的输入源,在工程中例化为V4L2架构设备,供上层软件调用.TPG全称为Test Pattern Generator,为F ...

最新文章

  1. springmvc使用和经验总结(长沙师说网络科技有限公司)
  2. 操作系统实验之作业调度算法
  3. linux FreeImage安装编译
  4. vue-lazyload 的vue 懒加载的使用
  5. thinkPHP源码目录介绍
  6. python *args用法_python函数参数*args**kwargs用法实例
  7. Python_socketserver
  8. Pyqt+QRcode 生成 识别 二维码
  9. python入口文件_用Python作GIS之三:入口程序 - stargui.py
  10. itextpdf 合并单元格 横向纵向
  11. 宠物王国6java变态版,宠物王国bt版修改器下载
  12. c++中计算2得n次方_【复习专题】解析二元一次方程知识点及应用
  13. 雷达imu联合标定lidar_imu_calib-main
  14. win32gui恢复小化窗口,前置窗口
  15. php mip,php批量清除MIP缓存
  16. 数学学习方法:直观思维的重要性
  17. 总结——STM32F103C8T6通过MAX31865读取PT100电阻值
  18. Windows构建Flutter环境,无法访问maven.google.com
  19. 项目中的精华功能讲解:相信大家都用过CSDN 中结贴的功能吧(弹出的小黄窗体)
  20. ACM故事之踏上贼船 by LittleKid

热门文章

  1. https协议必须使用443端口吗_http、https、http2、websocket之间的关系
  2. 学python有什么好处 学完可以做什么
  3. 简单介绍python的input,print,eval函数
  4. 执行前端测试的必要性
  5. 用 Linux 的 watch 命令观察命令和任务
  6. android dslr控制软件,DSLR Controller
  7. 泉州中考分数如何计算机,2019年泉州中考总分多少分,泉州中考各个科目多少分...
  8. tensorflow算法实战:普通的数据训练和迁移学习之后的数据训练进行图像的识别(包括前端页面)
  9. Alyona and a tree (树上倍增+差分)
  10. zynq tcp如何从网口发数据_ZYNQ_PL与PS的DDR交互