网络编程知识总结 之 简单的iOS HTTP服务器
来源:互联网 发布:linux嵌入式开发 编辑:程序博客网 时间:2024/05/29 16:47
本文主要是通过OC实现一个简单的iOS HTTP服务器,从而对HTTP通信的流程有更加深入的体会,同时该HTTP服务器添加了文件浏览的功能,可以方便的在浏览器中访问应用的文件(在项目开发阶段时访问应用文件比较有用),并且可以通过委托的方式自行处理HTTP请求和响应。整个工程的源码可以在文末的链接中找到。
原创文章,转载请声明
一.HTTP服务器简述
HTTP服务器也是基于TCP协议来实现的,关于HTTP协议相关信息这里不再赘述,简要介绍可查看前面的一篇文章。
在有客户端访问时建立TCP连接开始通信,首先服务端需要建立一个TCP的socket监听固定的服务端口来等待客户端来访问,客户端创建服务器监听端口的socket来进行访问。在TCP连接建立完成后传输HTTP请求和HTTP响应对应格式的数据来进行通信,客户端生成、发送HTTP请求信息,接收、解析响应信息,而服务端则刚好相反。
可以看出HTTP服务器的实现主要在于HTTP请求的处理以及响应的生成。
二.HTTP服务器的实现思路
OC实现基于TCP协议的网络通讯
在OC中实现TCP通讯的在关于iOS网络框架的文章中就已经提到过,可以使用OS层的BSD Socket,也可以使用Core Fundation层的CFNetWork来实现,但是这两者的使用都相对比较麻烦,需要自己来做较多的配置,以及处理多线程的问题。这里使用开源框架CocoaAsyncSocket,可以避免上述的繁琐操作,通过简单的参数设置和委托的实现便可以轻松实现TCP连接
HTTP请求与HTTP响应的解析与生成
请求与响应的解析与生成均需要严格遵从HTTP协议的规范,数据格式的介绍可以查看前面的一篇文章,在处理的过程中可以采用字符串分割的方式。
- 从数据格式可以看出HTTP请求和响应的Head与Body之间都是空行隔开,因此可以使用两个回车+换行符(/r/n/r/n)实现Head与Body的分离。
- 该步骤完成后Body已经完全分离,但Head仍未完全分离,其中首行还包含有请求行和状态行,其与请求头和响应头之间用回车+换行符(/r/n)分开,所有的请求头、响应头也是使用相同的方式进行分离。
- 请求头、响应头中的键值分离可以直接使用英文冒号进行分离
上述过程中HTTP请求是字符串分割的过程,而响应头的生成是其逆过程即字符串合成的过程。
关于HTTP请求方法的响应
HTTP协议中常见的有GET、POST、PUT、DELETE等常见方法,在这里对GET、POST两个方法做了处理,这了可以通过实现委托的方式去做单独的实现。
关于数据的响应Body数据的生成
对于文件则直接从文件中获取数据,若是文件夹则先生成一个文件目录的HTML文件,再获取文件的数据。
防止资源竞争的处理
由于可以通过HTTP协议进行资源的读写操作,这里对HTTP连接建立后通过同步队列的方式来管理建立的连接,以达到避免资源竞争的目的。
三.HTTP服务器的具体实现
服务器的使用方法如下:
self.httpServer = [[ZGHTTPServer alloc] initWithConfig:^(ZGHTTPConfig *config) { config.port = 12345;//若缺省配置,系统将自动分配可用的socket端口 config.rootDirectory = NSHomeDirectory(); //config.requestDelegate = self;//自定义解析完到HTTP请求时的委托 //config.responseDelegate = self;//自定义生成HTTP响应时的委托 }]; [self.httpServer start];
整个HTTP服务器实现的类图如下图所示:
其中:
ZGHTTPServer
用于管理和配置整个HTTP服务,包括服务初始化、端口的分配、连接队列的管理以及连接任务的分发等;
ZGHTTPConfig
用于配置一些HTTP服务的初始化信息如端口、根目录、委托源等;
ZGHTTPConnectTask
用于处理每一个连接任务,通过TCP连接完成数据的收发
ZGHTTPRequestHandler
、ZGHTTPResponseHandeler
用于在task当中读取和提供数据,并完成HTTP请求和响应的解析和生成;
ZGHTTPRequestHead
、ZGHTTPResponseHead
则是对请求头(包含请求行)和响应头(包含状态行)的封装相关
ZGHTTPPrivateAPI
则是在保证个模块内聚性的前提下,将一些私有的接口暴露出来以供HTTP服务内部使用。
该工程主要是为了更好的体验HTTP协议的具体过程,为了尽量的简化整个过程,仅仅对部分请求头和响应头的参数做了处理和生成。具体源码可以查看
四.小结
本工程主要使用OC实现了一个简单的HTTP服务器,以便更加深入的体会HTTP通信的机制,同时在代码中使用简单HTML文件生成的方式实现了文件夹的流览。
- 网络编程知识总结 之 简单的iOS HTTP服务器
- 网络编程知识(5)--用Netty实现的一个简单的HTTP服务器
- 网络编程知识总结 之 iOS网络框架概述
- iOS http网络请求相关知识总结
- iOS之HTTP网络编程
- iOS 开发 之网络编程简单总结转载
- java网络编程之HTTP服务器的实现
- 网络编程知识(6)--用Java编写HTTP服务器
- linux网络编程之简单的服务器多线程
- 网络编程之:TCP服务器的简单实现
- linux网络编程之简单的回射服务器
- iOS网络HTTP、TCP、UDP、Socket 知识总结
- iOS网络HTTP、TCP、UDP、Socket 知识总结
- iOS网络HTTP、TCP、UDP、Socket 知识总结
- iOS开发 - 网络编程之HTTP协议
- java网络编程之简单客户端服务器
- Linux网络编程之简单并发服务器
- Linux网络编程之简单并发服务器
- JAVA入门知识---小结
- ElasticSearch的head插件中如何使用cat接口
- Android编译错误error: ext4_allocate_best_fit_partial: failed to allocate 74 blocks, out of space?
- 补充
- Android源码(8) --- Binder(2) 序列化
- 网络编程知识总结 之 简单的iOS HTTP服务器
- 《Android 插件化框架VirtualAPK :(二)原理分析》
- 机器学习精简教程之一——线性代数知识
- 【Machine Learning】笔记:神经网络的表示
- 51nod 1126 求递推序列的第N项 矩阵快速幂
- Android2.2 连接GitHub时出错解决方法
- 线性表的线性存储和链式存储
- eclipse等号左边返回值类型代码自动补全(2017年7月31日19:59:51)
- Android源码(9) --- Binder(3) AIDL使用