Socket简介:
所谓socket,通常称为“套接字”,网络应用程序通过套接字向网络发送请求或者应答网络请求。socket通常用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或者不同计算机之间的通信。
应用场景:
1、即时通讯
特点:实时性,感觉不到延时和掉线,因为会监听socket的状态,如果掉线会进行重连。
2、服务器推送(web与服务器通信)
客户端与服务器建立一个TCP连接,实现全双工通信(核心:客户端定时向服务器发送心跳 包)
网络通信模型
Socket编程之TCP
*面向连接,可靠传输(保证数据正确性,顺序性),用于传输大量数据(流模式)、速度慢,建立连接开销比较大(时间,系统资源)
*流模式:在连接持续的过程中,基本上都是从同一个主机发出的,因此,需要保证数据是有序的到达。
*三次握手(建立TCP连接,需要C和S发送三个包),四次挥手(TCP连接的断开需要发送4个包)
TCP通信流程图
Socket编程之UDP
*UDP:非连接,不可靠传输,速度快,用于传输少量数据
*只要知道接收端的ip和端口,任何主机都可以向接收端发送数据
UDP通信流程图
iOS之Socekt编程
*BSDSocket(纯C)
iOS系统基于unix,所以支持底层的BSD Socket
*CFSocket(纯C)
对底层BSD Socket进行轻量级的封装
*AsyncSocket(OC)
使用OC封装的一个socket框架(支持TCP和UDP)
*SocketRocket(OC)
Square公司封装的一个WebSocket框架,用于原生和web APP和服务器通信
BSD Socket编程
一套unix系统下的socket API(纯C),在Xcode中可以直接使用,
Demo(简单实现C/S通信)地址:https://github.com/guodongyangwen/iOS-Socket.git
CFSocket
苹果对BSD Socket进行简单封装
主要使用的API:
CFSocekt(用于建立连接),CFStream(用于读写数据)
Demo地址:https://github.com/guodongyangwen/iOS-Socket.git
CocoaAsyncSocket(目前比较常用)
基于CFSocket进行OC的封装
支持TCP和UDP
完整的回调函数(用于处理各种回调时间,连接成功,断开连接,收到数据等)
基于GCD
Demo(模拟一个即时通信的场景)地址:https://github.com/guodongyangwen/iOS-Socket.git
需要注意的问题:
1、socket连接成功回调方法中主动调用:[self.socket readDataWithTimeout:-1 tag:0];,相当于主动添加一个读取请求,不然不会执行读取信息回调方法
2、读取信息回调方法中,读取完信息后,主动调用一下[self.socket readDataWithTimeout:-1 tag:0];,读取完信息后,重新向队列中添加一个读取请求,
不然当收到信息后不会执行读取回调方法。
WebSocket
*适用于web应用的可持久连接的全双工通讯协议,被称为“Web的TCP”,实现了浏览器和服务器的双向通信同样也适用于原生应用,协议本身使用“ws://URL”格式,是在标准http协议之上实现的,浏览器和服务器之间只需做一次握手操作后,就会创建一个快速通信通道。
*解决问题:以前的服务器推送是通过浏览器轮询的方式进行,(时间间隔太长:不实时,体验差,太短: 消耗资源,服务器负载太大
SocketRocket:基于OC封装的一个WebSocket框架
SocketIO:也支持WebSocket,内部封装了SocektRocket
Demo(长连接实现服务器推送)地址:https://github.com/guodongyangwen/iOS-Socket.git
One More Thing:
CFNetwork:
基于OS层BSDSocket封装,用于网络通信(纯C),早起的网络请求框架爱ASIHTTPRequest就是基于CFNetwork进行封装
主要API:
CFSocket:用于底层的通信
CFStream:用于数据的读写
Demo地址(图片请求):https://github.com/guodongyangwen/iOS-Socket.git