练习项目:使用BSD Socket实现HTTP Server的GET和POST方法,可以上传文件
- GET - 返回静态网页
- POST-通过表单提交图片文件,并在客户端展示
- 监听连接的主socket创建
- 使用dispatch source监听连接事件
- 创建每一个连接sockets创建线程
- dispatch queue
- 数据接收
- prebuffer
- package 用tag来区分
- 读取
- 固定长度
- 指定结束符
- 写数据
- packageWrite
-
iOS中CFNetwork中有相关实现CFHTTP API 如CFHTTPMessageRef
- HTTP Connect与 TCP socket连接的对应关系问题
- 服务器建立的HTTP Connect 就是一个 socket connect连接,要接收读写数据
- HTTP Connect与 TCP socket连接的对应关系问题
-
Header解析 收到一部分就解析一部分 ,可能对此回调才解析完一个header
- request解析
- 目标是支持简单的GET 、POST方法—通过url返回文件夹下的文件(静态网页功能)和文件上传方法
- request解析
-
如何断开连接
- HTTP :1.0?每次连接只处理一个request 服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
- 1.1可以一个连接有多个请求,— 断开方式不同,还有就是header字段
- http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间
- HTTP :1.0?每次连接只处理一个request 服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
-
Requeset解析
- 分步解析
- 获取Header数据 -- 关键分隔符—header结束分隔符 /r/n/r/n
- 解析Header字段
- 行分隔符 — /r/n
- 解析基础信息-状态信息
- 解析Body
- 通过header里面的Content-Length获取body长度
- boundary+Multipart
- part header解析
- 数据读取
- 所有的header一次性获取 /n/r/n/r 作为header和body的结束标记
- 按照行读取,如状态行,header中的字段行,然后是body读取
- 分步解析
-
response生成
- 返回指定文件
- 状态码
- header数据
- body