Socket簡介:
? ? 所謂socket,通常稱為“套接字”侠讯,網(wǎng)絡(luò)應(yīng)用程序通過套接字向網(wǎng)絡(luò)發(fā)送請求或者應(yīng)答網(wǎng)絡(luò)請求沸柔。socket通常用于描述IP地址和端口,是一個通信鏈的句柄整份,可以用來實現(xiàn)不同虛擬機或者不同計算機之間的通信待错。
應(yīng)用場景:
1、即時通訊
? ? 特點:實時性烈评,感覺不到延時和掉線火俄,因為會監(jiān)聽socket的狀態(tài),如果掉線會進行重連讲冠。
2瓜客、服務(wù)器推送(web與服務(wù)器通信)
? ?客戶端與服務(wù)器建立一個TCP連接,實現(xiàn)全雙工通信(核心:客戶端定時向服務(wù)器發(fā)送心跳 ? ? ? ? ? ? ? ? 包)
網(wǎng)絡(luò)通信模型
Socket編程之TCP
? ? *面向連接竿开,可靠傳輸(保證數(shù)據(jù)正確性谱仪,順序性),用于傳輸大量數(shù)據(jù)(流模式)否彩、速度慢疯攒,建立連接開銷比較大(時間,系統(tǒng)資源)
? ? *流模式:在連接持續(xù)的過程中列荔,基本上都是從同一個主機發(fā)出的卸例,因此称杨,需要保證數(shù)據(jù)是有序的到達。
? ? *三次握手(建立TCP連接筷转,需要C和S發(fā)送三個包),四次揮手(TCP連接的斷開需要發(fā)送4個包)
TCP通信流程圖
Socket編程之UDP
? ? *UDP:非連接悬而,不可靠傳輸呜舒,速度快,用于傳輸少量數(shù)據(jù)
? ? *只要知道接收端的ip和端口笨奠,任何主機都可以向接收端發(fā)送數(shù)據(jù)
UDP通信流程圖
iOS之Socekt編程
? ? *BSDSocket(純C)
? ? ? ? iOS系統(tǒng)基于unix袭蝗,所以支持底層的BSD ?Socket
? ? *CFSocket(純C)
? ? ? ? 對底層BSD Socket進行輕量級的封裝
? ? *AsyncSocket(OC)
? ? ? ?使用OC封裝的一個socket框架(支持TCP和UDP)
? ? *SocketRocket(OC)
? ? ? ? Square公司封裝的一個WebSocket框架,用于原生和web APP和服務(wù)器通信
BSD Socket編程
? ? 一套unix系統(tǒng)下的socket API(純C)般婆,在Xcode中可以直接使用到腥,
? ? Demo(簡單實現(xiàn)C/S通信)地址:https://github.com/guodongyangwen/iOS-Socket.git
CFSocket
蘋果對BSD Socket進行簡單封裝
主要使用的API:
? ?CFSocekt(用于建立連接),CFStream(用于讀寫數(shù)據(jù))
Demo地址:https://github.com/guodongyangwen/iOS-Socket.git
CocoaAsyncSocket(目前比較常用)
?基于CFSocket進行OC的封裝
?支持TCP和UDP
完整的回調(diào)函數(shù)(用于處理各種回調(diào)時間蔚袍,連接成功乡范,斷開連接,收到數(shù)據(jù)等)
基于GCD
Demo(模擬一個即時通信的場景)地址:https://github.com/guodongyangwen/iOS-Socket.git
需要注意的問題:
? ? 1啤咽、socket連接成功回調(diào)方法中主動調(diào)用:[self.socket readDataWithTimeout:-1 tag:0];晋辆,相當(dāng)于主動添加一個讀取請求,不然不會執(zhí)行讀取信息回調(diào)方法
? ? 2宇整、讀取信息回調(diào)方法中瓶佳,讀取完信息后,主動調(diào)用一下[self.socket readDataWithTimeout:-1 tag:0];鳞青,讀取完信息后霸饲,重新向隊列中添加一個讀取請求,
不然當(dāng)收到信息后不會執(zhí)行讀取回調(diào)方法臂拓。
WebSocket
? ? *適用于web應(yīng)用的可持久連接的全雙工通訊協(xié)議厚脉,被稱為“Web的TCP”,實現(xiàn)了瀏覽器和服務(wù)器的雙向通信同樣也適用于原生應(yīng)用埃儿,協(xié)議本身使用“ws://URL”格式器仗,是在標(biāo)準(zhǔn)http協(xié)議之上實現(xiàn)的,瀏覽器和服務(wù)器之間只需做一次握手操作后童番,就會創(chuàng)建一個快速通信通道精钮。
? ? *解決問題:以前的服務(wù)器推送是通過瀏覽器輪詢的方式進行,(時間間隔太長:不實時剃斧,體驗差轨香,太短: 消耗資源,服務(wù)器負載太大
SocketRocket:基于OC封裝的一個WebSocket框架
SocketIO:也支持WebSocket幼东,內(nèi)部封裝了SocektRocket
Demo(長連接實現(xiàn)服務(wù)器推送)地址:https://github.com/guodongyangwen/iOS-Socket.git
One More Thing:
CFNetwork:
? ?基于OS層BSDSocket封裝臂容,用于網(wǎng)絡(luò)通信(純C)科雳,早起的網(wǎng)絡(luò)請求框架愛ASIHTTPRequest就是基于CFNetwork進行封裝
主要API:
CFSocket:用于底層的通信
CFStream:用于數(shù)據(jù)的讀寫
Demo地址(圖片請求):https://github.com/guodongyangwen/iOS-Socket.git