iOS网络编程层次
iOS网络编程层次结构也分为三层:
- Cocoa层:NSURL,Bonjour,Game Kit,WebKit
- Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices
- OS层:基于 C 的 BSD socket
Cocoa层:是最上层的基于 Objective-C 的 API,比如 URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API。Cocoa 层是基于 Core Foundation 实现的。
Core Foundation层:因为直接使用 socket 需要更多的编程工作,所以苹果对 OS 层的 socket 进行简单的封装以简化编程任务。该层提供了 CFNetwork 和 CFNetServices,其中 CFNetwork 又是基于 CFStream 和 CFSocket。
OS层:最底层的 BSD socket 提供了对网络编程最大程度的控制,但是编程工作也是最多的。因此,苹果建议我们使用 Core Foundation 及以上层的 API 进行编程。
socket server 实现
这里介绍两种ios上的socket server的实现方案:
1、第一种采用原始的socket方案,
实现逻辑如下图:
ios上可以直接使用基于c语言的BSD socket,也可以使用 Core Foundation层的CFNetwork。
2、只用BSD socket 实现了绑定和监听,数据的读写直接使用的CFStream。
a、socket的绑定和监听
使用BSD Socket创建
|
|
上面的步骤实现了socket的绑定和监听,要实现socket数据的读写需要创建可读写的管道并连接到socket。
b、创建管道
创建管道的方式有很多种。CFNetWork中提供了CFReadStreamRef 和CFWriteStreamRef两种Stream,用于接收和写入数据。可以用以下方法来创建输入输出流。
|
|
创建好的输入输出流需要登记要接收的流的相关事件,这里 writeStream 的kCFStreamEventCanAcceptBytes 事件表示可以写入数据了,readStream 的kCFStreamEventHasBytesAvailable 表示有数据需要读取。
|
|
WriteStreamClientCallBack 和 ReadStreamClientCallBack是用来接收相关事件的回调方法,CFStream中规定好了这两个回调函数格式。
|
|
具体实现如下:
|
|
c、将writeStream和readStream 添加到runloop中,以便接收相关事件。
|
|
d、最后调用 CFReadStreamOpen 和 CFWriteStreamOpen打开Stream。
|
|
其他
- 代替CFSTream实现管道的其他方式
读写Socket数据,GCD还提供了一种方式:
读取数据
|
|
写入数据
|
|
不论是读取数据和写入数据,当数据量较大时,都需要递归的调用 dispatch_read 和 dispatch_write 来进行读写。
本文作者: ctinusdev
本文链接: https://ctinusdev.github.io/2017/08/13/BSDSocketServer/
转载请注明出处!