网络编程知识总结 之 简单的iOS HTTP服务器
网络知识总结 之 简单的ios http服务器,本文主要是通过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文件生成的方式实现了文件夹的流览。
下一篇: “网红架构师”解决你的Ceph 运维难题