应用层自定制协议

应用层协议

我们在解决一个实际问题,满足日常需求的网络程序,都是在应用层。
协议就是一种“约定”,socket api 的接口,在读写数据的时候都是按”字符串“的方式来发送接受的,但是如果我们要传输一些”结构化的数据结构“就要自定制协议了;
网络计算器

例如,现在实现一个服务器版本的加法器,我们需要把客户端要计算的两个加数发送过去,然后服务器进行计算,最后再把计算结构返回到客户端;
约定方案:

  • 定制结构体来表达要交互的信息;
  • 发送数据将这个结构体按照一个规则转换成字符串,接受数据的时候再按照相同的规则把字符串转化为结构体;
  • 这个过程叫做”系列化“和”反序列化“
  • 序列化和反序列化的方法有很多我们这里就利用JOSN来实现

json 是一种非常重要的序列化/反序列化的方式
json 的优点:直观,方便调试。文本方式序列化
缺点:效率低

网络计算器

这是我分别用 stringstream 和 josn 实现两种版本的网络计算器的代码,具体流程在代码在注释的很清楚。
HTTP协议是应用层协议,基于TCP协议(3.0版本可基于UDP版本)
HTTP协议

虽说应用层的协议可以自己定,但是实际上大佬们定义的一些现成的,非常好用的应用层协议,供我们一直使用。HTTP(超文本传输协议)就是其中之一。

URL

说到HTTP就不得不说说URL,平时我们俗称的”网站“,就是”URL“
在这里插入图片描述

urlencode 和 urldecode

像/?:等这样的字符串,已经被url当作特殊意义理解了,因此这些字符串不能随意出现。
比如,某个参数中需要带有这样特殊的字符,就必须先对字符进行特殊转义。
将需要的转码的字符转为16进制,然后从右到左,取4位(不足4位时直接处理),每两位做一位,前面加上%,编码成%XY格式。

c++=>c%2B%2B

urldecode 就是urlencode的逆过程

HTTP协议格式

在这里插入图片描述
这是我用fiddler抓包工具抓到的登陆我们教务系统的HTTP请求。

请求:

  1. 首行(使用空格分隔):
  • 方法:GET(获取)POST(传输实体文件) PUT(传输文件) DELETE HEAD 等
  • URL
  • HTTP版本号 HTTP/1.1时最常见的二版本号
  1. 头部信息(header):包含若干行,每一行都是一个键值对,键和值之间用 “ :”分隔
  2. 空行:表示header的结束
  3. 请求体(boby):空格后面全是boby,boby是可选的,可有可无,一般来说GET请求不带boby,POST/PUT请求带boby

响应:

  1. 首行:
  • 版本号
  • 状态码
  • 状态码描述的信息
  1. header:有若干行,每一行都是键值对
  2. 空行:表示header部分结束
  3. boby:空行之后全是boby

GET和POST的区别:
设计之初GET从服务器上拿数据,POST向服务器发送数据
但是现在GET可以向服务器放数据,POST可以从服务器上拿数据
区分GET和POST的方法只有:
GET往往将参数放到query_string中,POST将数据放到boby中

常见的HTTP状态码:
- 1XX:信息提示
- 2XX:成功,例如 200 表示访问成功
- 3XX:重定向,例如 302 Found表示重定向 ,303 see other 重定向Location字段表示重定向到哪个url上去
- 4XX:客户端出现错误,403 Forbiden用户没有访问权限,404 Not Found 没有找到指定的资源
- 5XX:服务器出现错误,502 Bad Gateway 服务器挂了 504 Gateway Timeout服务器响应超时
-

常见的header
- Content-Type: 响应boby的数据是什么类型的text/html描述了页面的骨架 text/css,Content-Length boby 的长度(单位是字节)
- Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
- User-Agent: 描述浏览器和操作系统的信息(能区分电脑访问和手机访问),手机端访问的时候看到的页面并不是服务器根据UA来吐一个单独的比较窄的页面,而完全靠前端技术来实现的(响应编程)
- referer:当前页面是通过哪个页面跳转来的(莆田医院给百度算多少广告费就应该参考的这个数据)
- Cookie:是一个保存在浏览器的字符串,字符串的含义是程序员内部约定的,外部的用户一般都看不懂,Cookio中最常见的内容是用户的身份信息,当我们登陆服务器就是回返回一个身份信息字符串,浏览器通过Ser-Cookie保存早Cookie后续浏览器在打开这个网页时就会带有返回的Cookie,自动登陆

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值