如何自定义一个协议

这篇具有很好参考价值的文章主要介绍了如何自定义一个协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

.

如何自定义一个协议,网络协议

如何自定义一个协议

先有一个需求,有个场景,打开外卖软件,会显示商家列表,列表中有很多项,每一项都包含了一些信息,商家的名称,图片,好评率,距离你的位置,评分
这些信息都是通过网络,从服务器获取的,
客户端,需要给服务器发送一个请求,服务器收到请求之后,就给客户端返回一个响应,这里的请求和响应该如何创建呢,格式是怎样的呢?
我们可以做出如下设计:
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文件转化成一些代码,再嵌入到程序中使用,这个主要用于对于性能要求更高的场景
对于一个程序来说,开发效率/运行效率哪个更重要
通常来说,是开发效率更重要,可以通过提升硬件设备,来提高运行效率,想要提高开发效率,就得招聘更多的程序员,成本开销更大
当然,在类似游戏开发的场景,就是需要运行效率更高比较重要文章来源地址https://www.toymoban.com/news/detail-836024.html

到了这里,关于如何自定义一个协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络编程五--自定义应用层协议

    前面回声服务器/客户端介绍了如何通过对收发IO的控制实现回声服务器/客户端。 在服务器端应用层的处理(协议)可以看作是“回声操作”,即回发客户端发来的消息。而在客户端应用层的处理(协议)则只是简单显示服务器回发的内容。 而协议的通俗理解,就是为了完成

    2024年02月03日
    浏览(92)
  • 谈谈网络协议的定义、组成和重要性

    个人主页: insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络协议的定义 二、网络协议的组成

    2024年02月12日
    浏览(41)
  • workerman 自定义的协议如何解决粘包拆包

    前言:         由于最近在使用 workerman 实现 Unity3D 联机游戏的服务端,虽然也可以通过 TCP 协议直接通信,但是在实际测试的过程中发现了一些小问题。         比如双方的数据包都是字符串的方式吗,还有就因为是字符串就需要切割,而有时候在客户端或服务端接收时都

    2024年02月09日
    浏览(41)
  • 【网络原理进阶篇】自定义协议,协议约定符,三次握手,四次挥手,TCP(保证可靠性机制)和UDP原理

    前言: 大家好,我是 良辰丫 ,我们已经学习了网络原理基础版,初步认识了网络,还学习了网络编程,了解了网络通信的各种程序,接下来我们更深入的了解网络是如何工作的.这篇文章我们主要介绍协议,UDP和TCP的一些原理.💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎

    2023年04月24日
    浏览(90)
  • 如何自定义一个单例类?

    要自定义编写一个单例类,有两种方法如下: 一、饿汉式单例: 饿汉式单例指的是在 类加载时就创建并初始化单例对象 。下面是一个简单的饿汉式单例Bean的示例: 二、懒汉式单例: 1、将类的 构造方法私有化 ,以防止其他代码通过new创建对象。 2、在类内部创建一

    2024年02月13日
    浏览(32)
  • 根据源码,模拟实现 RabbitMQ - 网络通讯设计,自定义应用层协议,实现 BrokerServer (8)

    目录 一、网络通讯协议设计 1.1、交互模型 1.2、自定义应用层协议 1.2.1、请求和响应格式约定 ​编辑 1.2.2、参数说明 1.2.3、具体例子 1.2.4、特殊栗子 1.3、实现 BrokerServer 1.3.1、属性和构造 1.3.2、启动 BrokerServer 1.3.3、停止 BrokerServer 1.3.4、处理每一个客户端连接 1.3.5、读取请求

    2024年02月10日
    浏览(51)
  • 【Linux】简单的网络计算器的实现(自定义协议,序列化,反序列化)

    我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端` 详细可参考我之前写的博客【Linux】记录错误信息日志的实现

    2024年02月19日
    浏览(55)
  • python如何定义一个简单的队列

    哈哈,其实根本不需要用 类 (class)去定义一个 队列 (queue),因为我没有想到 list 结构竟然这么万能,它本身就是一个活生生的 队列 。 1.定义一个队列,其实就是一个列表哈哈,说明一下,队头在前面,队尾在后面。 即,这个队列a对应如下图示: 2.入队 insert tail ,这个大家

    2023年04月08日
    浏览(47)
  • 如何正确实现一个自定义 Exception

    最近在公司的项目中,编写了几个自定义的 Exception 类。提交 PR 的时候,sonarqube 提示这几个自定义异常不符合 ISerializable patten. 花了点时间稍微研究了一下,把这个问题解了。今天在此记录一下,可能大家都会帮助到大家。 编写一个自定义的异常,继承自 Exception,其中定义

    2024年02月10日
    浏览(35)
  • angular中如何定义一个全局组件?

    需求,我们需要新建一个navBreadcrumb的全局组件。这是一个面包屑导航,在不同的页面引入时传入一个路由数组即可。 第一步:我们新建这个组件: 这里有几个要注意的点: 1 ---nav-breadcrumb.module----------这个文件时一定要的。angular和vue/react不同,modulecomponent,对于任何页面而

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包