iOS中的Socket编程

TCP与HTTP

TCP对应传输层,HTTP对应应用层。

一般我们是通过发送http请求从服务器获取信息,而http其实也是建立在TCP协议基础上的,只不过请求完毕后会将TCP断开,属于短连接(无状态连接)。http1.1中有了个keep-alive,可以实现多个request和response但还是一对一,且是被动的,服务端不能主动发起请求,所以便有了Socket(ajax轮询和long poll(服务器hold连接等有消息了再返回)也是伪长连接的解决方案)。

Socket的第一次握手也是基于HTTP协议,只是加入了Upgrade和Connection等Socket关键字。且整个通讯过程的建立只需要这一次握手即可维持连接状态。

Socket编程

Socket编程,对TCP/IP协议(或UDP)的封装和抽象,不是一种协议,更像是一个接口。建立Socket连接至少需要一对套接字:ClientSocket,ServerSocket。步骤:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),服务器监听到连接,执行accept,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。即:服务器监听→客户端请求→连接成功→服务端可主动发消息。

心跳线程:为了检测Client和Server是否正常链接,基于ping pong流程:client定时执行ping向outPutStream中写入ping数据→server读取判断是否为ping→抛出pingException后执行onping更新心跳时间,并执行pong→client读取判断是否为pong→抛出pongException后执行onpong更新心跳时间。

iOS中的Socket

三大框架:CocoaAsyncSocket(支持UDP但头文件和readme不友好),SocketRocket(使用简单facebook出品),socket.IO-objc(基于SocketRocket更轻量但太老了)。

基本实现

CocoaAsyncSocket:与服务器三次握手实现连接,参数host和port。创建socket对象赋值代理和队列选择→连接connectToHost: onPort: error → 代理的实现(didConnectToHost、socketDidDisconnect、didWriteDataWithTag、didReadData等)

开启接收消息:readDataToData: withTimeout: maxLength: tag:

发送消息:writeData: withTimeout: tag:,格式NSData(心跳的发送也用这个方法)

注:程序进入后台记得断开长连接。

你可能感兴趣的:(iOS中的Socket编程)