如何自定义一个协议

.

在这里插入图片描述

如何自定义一个协议

先有一个需求,有个场景,打开外卖软件,会显示商家列表,列表中有很多项,每一项都包含了一些信息,商家的名称,图片,好评率,距离你的位置,评分
这些信息都是通过网络,从服务器获取的,
客户端,需要给服务器发送一个请求,服务器收到请求之后,就给客户端返回一个响应,这里的请求和响应该如何创建呢,格式是怎样的呢?
我们可以做出如下设计:
1.明确当前请求和响应中包含哪些信息
请求:用户身份,用户当前位置
响应:商家的名称,图片,好评率,距离你的位置,评分
2.明确具体的请求和响应的格式
示例1:
请求:1234,23 100\n
所谓的明确格式就是看你按照什么样的方式,构造出一个字符串,后续这个字符串就可以作为udp或者tcp的payload进行传输,另一方面,服务器就可以对这个字符串进行分析,解析出逗号前面是用户身份,逗号后面是用户当前位置(经纬度)
响应:
老麻抄手,1.jpg,96%,1.3km,4.6\n
这个时候就构造出了一个响应这样的字符串,用户就可以按照这样的格式来进行解析了
网络上,传输的数据,本质上就是字符串,因为无法直接传输传输一个java对象这样的内容
java写代码,都是使用的各种对象,但是最后在发送数据的时候,就需要把对象转换为二进制的字符串(序列化)
而在接收数据的时候,也需要把二进制的字符串转换为对象(反序列化)
实际上,上述这样的约定,可以随意构造,只要保证,客户端和服务器遵守同一个约定即可
示例2:
鱼香肉丝;1.jpg;96%;2.6km;4.5!
使用!来分割每个商家,使用;来分割商家的每个信息

通用的协议格式

虽然说,自定义的协议格式,是可以任意的,但是为了避免出现过于天马行空的设计,大佬们就做出了一些通用的协议格式,参考这些格式,就可以对咱们的协议设计产生重要的指导作用

xml

是以成对的标签,来表示"键值对"信息,同时标签支持嵌套,就可以构成一些更为复杂的树形结构数据
请求:
< request>
< userId>1234< /useId>
< position>100 80< /position>
< /request>
对象的本质上也是键值对,属性的名字就是键,属性的值就是值
html是写网页的语言,也是带有标签的
xml里的标签都是程序员自定义的,html里的标签,都是有一套标准规定好的
响应:
< response>
< shops>
< shop>
< name>老麻抄手< /name>
< image>1.jpg< /image>
< distance>1km< /distance>
< rate>96%< /rate>
< star>4.7< /star>
< /shop>
< shop>
< name>鱼香肉丝< /name>
< image>1.jpg< /image>
< distance>2km< /distance>
< rate>94%< /rate>
< star>4.6< /star>
< /shop>
< /shops>
< /response>
优点:xml非常清晰的把结构化数据表示出来了
缺点:表示数据需要引入大量的标签,看起来非常繁琐,同时也占用了不少的网络带宽
国内,最贵的硬件资源,就是网络带宽

json

最流行的一种数据组织格式
本质上也是键值对,看起来比xml要干净不少
请求:
{
useId:1234,
position:“100 80”
}
json中,使用{}表示键值对,使用[]表示数组,数组里的每个元素,可以是数字,可以是字符串,也可以是其他的{},[]
响应:
[
{
name:‘老麻抄手’,
image:‘1.jpg’,
distance:1km,
rate:96%,
star:4.7
},
name:‘鱼香肉丝’,
image:‘1.jpg’,
distance:2km,
rate:97%,
star:4.5
]
当前最主流的一种网络数据传输的格式,未来实际开发中经常会用到json格式的数据
json对于换行并不敏感,如果这些内容全部都放在同一行,也是完全合法的
一般网络传输的时候,会对json进行压缩(去掉不必要的换行和空格),同时把所有的数据放到一行去,整体占用的带宽就更低了,但是会影响到可读性

protobuffer

谷歌提供的一套,二进制的数据序列化方式
使用二进制的方式,约定某几个字节,表示哪个属性
最大程度上节省了空间(不必传输key,根据位置和长度,区分每个属性)
优点:
节省带宽,最大化优化效率
缺点:二进制数据,肉眼无法直接观察,不方便调试
使用起来也是比较复杂的,需要专门编写一个proto文件,描述数据的格式咋写,proto需要一系列的语法,有点像java/c++又不太一样,再进一步的通过proto提供的工具,把proto文件转化成一些代码,再嵌入到程序中使用,这个主要用于对于性能要求更高的场景
对于一个程序来说,开发效率/运行效率哪个更重要
通常来说,是开发效率更重要,可以通过提升硬件设备,来提高运行效率,想要提高开发效率,就得招聘更多的程序员,成本开销更大
当然,在类似游戏开发的场景,就是需要运行效率更高比较重要

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484505.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP攻击,该怎么防护

一般网络世界里为人们所熟知的DDoS攻击&#xff0c;多数是通过对带宽或网络计算资源的持续、大量消耗&#xff0c;最终导致目标网络与业务的瘫痪&#xff1b;这类DDOS攻击&#xff0c;工作在OSI模型的网络层与传输层&#xff0c;利用协议特点构造恶意的请求载荷来达成目标资源耗…

从底层理解MySQL-字符类型

目录 VARCHAR和CHAR VARCHAR CHAR 存储的长度超限 CHAR和VARCHAR的区别&#xff1a; BLOB和TEXT MySQL中除了数值类型外&#xff0c;另一个用的比较多的就是字符类型了。字符类型有很多不同种类&#xff1a;VARCHAR,CHAR,BLOB,TEXT VARCHAR和CHAR VARCHAR VARCHAR是变…

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中&#xff0c;经常会使用到等高线&#xff0c;大多数情况下&#xff0c;从网上获取的高程数据都是DEM文件&#xff0c;我们可以通过ArcGIS Pro来生成等高线&#xff0c;这里为大家介绍一下生成方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的…

springboot206基于SpringBoot的农商对接系统的设计与实现

基于Spring Boot的农商对接系统的设计与实现 Design and implementation of agricultural business docking system based on Spring Boot 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离…

【Chrono Engine学习总结】4-vehicle-4.3-两个vehicle碰撞测试

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 今天突发奇想&#xff0c;想试一下&#xff0c;是否可以实现两个vehicle的碰撞&#xff1f; 1、两辆vehicle的仿真 官方提供了demo_VEH_TwoCars这个demo&#xff0c…

React -- useEffect

React - useEffect 概念理解 useEffect是一个React Hook函数&#xff0c;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff08;副作用&#xff09;, 比 如发送AJAX请求&#xff0c;更改DOM等等 :::warning 说明&#xff1a;上面的组件中没有发生任何的用…

暴风一期 黑群晖折腾流水账

起因是想和女友一起分享各自手机中的小猫照片&#xff0c;经过上网查资料了解到了群晖&#xff0c;可惜正版白群晖售价太高&#xff1a; 无奈选择了黑群晖&#xff0c;白群晖其实也可以简单理解为一台电脑多装了几块硬盘&#xff0c;然后装了一个文件服务器系统&#xff0c;这个…

CoordConv(NeurIPS 2018)

paper&#xff1a;An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution official implementation&#xff1a;https://github.com/uber-research/coordconv 存在的问题 本文揭示并分析了CNN在两种不同类型空间表示之间转换能力的欠缺&#…

每日OJ题_二叉树dfs⑤_力扣230. 二叉搜索树中第K小的元素

目录 力扣230. 二叉搜索树中第K小的元素 解析代码 力扣230. 二叉搜索树中第K小的元素 230. 二叉搜索树中第K小的元素 难度 中等 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数…

RocketMQ—RocketMQ消息重复消费问题

RocketMQ—RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题&#xff1a; 生产者多次投递消息&#xff1a;如果生产者发送消息时&#xff0c;连接有延迟&#xff0c;MQ还没收到消息&#xff0c;生产者又发送了一次消息&#xff1b; 消费者方扩容…

3个wordpress中文企业主题模板

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题&#xff0c;农业农村现代化&#xff0c;离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主题 浅绿色简洁实用的老年公寓wordpress主题&#xff0c;适合做养老业务的老年公…

三防平板丨三防工业平板电脑丨三防平板电脑有哪些优势?

三防平板电脑通常使用特殊材料和制造工艺来达到防水、防尘、防摔的目的&#xff0c;这样可以在极端条件下使用&#xff0c;并保证设备的稳定性和可靠性。因此&#xff0c;三防平板电脑适用于各种恶劣环境&#xff0c;如户外野营、物流、工业制造等应用场景。那么相比于普通消费…