网络通信中,协议是非常重要的概念,接下来我将按照协议的分层,来介绍每一层中的核心协议。
应用层是对应着应用程序的,是程序员关注的最多的地方,操作系统提供的网络API就是属于应用层的。应用层有很多现成的协议,但更多的,需要程序员根据场景自己制定协议,例如数据如何传输,以什么格式传输等。
自定义协议需要考虑两个内容:
服务器必须按照上面的约定 解析请求,构造响应。
客户端也必须按照上面的约定 发送请求 ,解析响应
举个例子:
我们打开外卖软件,外卖软件获取到我们的位置后,会出现很多的附近的商家显示在手机上,显示的商家中还包含了,名称,菜品,评分等数据。上述数据是按照什么样的格式组织的。
我们现在约定,一个请求或响应,都是以文本表示,以 换行符 \n 结束,多个字段之间用 ; 隔开。那么我们要组织上面场景的数据就是:
1.请求(给服务器提供位置信息)
地址\n
2.响应(提供附件的商家信息)
名称;菜品;评分\n
名称;菜品;评分\n
......
服务器和客户端之间往往要交互的是“结构化数据”
网络传输的数据是“字符串” “二进制bit流”
约定协议的过程就是约定? 结构化数据 和 字符串/二进制bit流? 互相转化的过程
把结构化数据转成? 字符串/二进制bit流? 的过程称为序列化,反之称为反序列化
上面我们演示的约定协议的方法虽然能解决问题,但是可读性和扩展性并不好,为了让程序员更方便的去约定这里的格式,业界给出了几种比较好用的方案。
1.xml
大致形式如下:
//请求
<requset>
<position>地址</position>
<requset>
//响应
<response>
<merchants>
<merchant>
<name> 名称 </name>
<score> 评分 </score>
<commodity>商品名称</commodity>
</merchant>
</merchants>
</response>
<>为开始标签,</> 为结束标签,标签能对数据进行描述,提高了可读性,缺点是浪费空间过多,消费更多网络带宽。
2. json
大概形式如下:
//请求
{
position:地址
}
//响应
[
{
name:商家名称,
score:评分,
commodity:商品名称,
},
{
name:商家名称,
score:评分,
commodity:商品名称,
}
]
我们可以看到json是键值对结构,键和值之间用 : 隔开,键值对之间用 , 隔开, 多个键值对用{}括起来形成一个json对象,多个json对象可以用[ ] 括起来用 , 分隔 形成一个json数组。