IOS开发入门之简单的iOS HTTP服务器
白羽 2019-01-23 来源 :网络 阅读 1317 评论 0

摘要:本文将带你了解IOS开发入门网络编程知识总结 之 简单的iOS HTTP服务器,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门网络编程知识总结 之 简单的iOS HTTP服务器,希望本文对大家学IOS有所帮助。


网络编程知识总结  之 简单的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文件生成的方式实现了文件夹的流览。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程