我們要做一個(gè)IM(InstantMessaging 即時(shí)通訊)鳍怨,直觀的從名字上看實(shí)效性是很重要的。那么以何種方式來(lái)實(shí)現(xiàn)呢佛致?http輪詢(xún)還是socket珠闰?
Http輪詢(xún)
Http輪詢(xún)分為短輪詢(xún)、長(zhǎng)輪詢(xún)染乌;何為短輪詢(xún)山孔,何為長(zhǎng)輪詢(xún)呢;以用戶A給用戶B發(fā)消息為例荷憋,用戶B怎么知道對(duì)方發(fā)消息給自己呢台颠?
短輪詢(xún)
用戶B不斷的發(fā)送請(qǐng)求給服務(wù)器,查詢(xún)是否有消息勒庄,然后服務(wù)器會(huì)立即響應(yīng)這個(gè)請(qǐng)求串前;這就是短輪詢(xún)
瘫里。那么這樣會(huì)有什么問(wèn)題呢?發(fā)送http請(qǐng)求酪呻,需要建立連接减宣,響應(yīng)后連接斷開(kāi),這是一次http請(qǐng)求過(guò)程玩荠;如果不斷的發(fā)送http請(qǐng)求漆腌,就會(huì)不斷的建立連接、斷開(kāi)連接阶冈,這樣很耗費(fèi)資源闷尿。那怎么辦呢?
長(zhǎng)輪詢(xún)
上面短輪詢(xún)不斷發(fā)送請(qǐng)求導(dǎo)致資源的浪費(fèi)女坑,那么是否可以減少請(qǐng)求的次數(shù)呢填具?于是就有B發(fā)送一個(gè)請(qǐng)求給服務(wù)器查詢(xún)是否有消息;如果沒(méi)有匆骗,此時(shí)服務(wù)器就會(huì)hold住這個(gè)請(qǐng)求劳景,直到有消息或者是超時(shí)再響應(yīng);如果有碉就,服務(wù)器會(huì)立即響應(yīng)這個(gè)請(qǐng)求盟广;這就是長(zhǎng)輪詢(xún)
。這樣會(huì)有問(wèn)題嗎瓮钥?雖然建立連接筋量、斷開(kāi)連接的次數(shù)少了,但是如果用戶數(shù)量很大碉熄,那么就會(huì)出現(xiàn)服務(wù)器hold住請(qǐng)求的數(shù)量增大桨武,答案顯然易見(jiàn)。
Socket
什么是socket锈津?
socket是對(duì)TCP/IP協(xié)議的封裝呀酸,它的出現(xiàn)只是使得程序員更方便的使用TCP/IP協(xié)議棧而已。socket本身并不是協(xié)議琼梆,它是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層七咧,是一組調(diào)用接口(TCP/IP網(wǎng)絡(luò)的API函數(shù))
socket連接過(guò)程
由此圖看出socket,分為客戶端和服務(wù)端叮叹,而建立連接后不會(huì)像http請(qǐng)求一樣,響應(yīng)后就斷開(kāi)連接了爆存,而這條連接叫長(zhǎng)連接蛉顽。那么連接需要哪些要素呢??jī)蓚€(gè)設(shè)備之間網(wǎng)絡(luò)通信先较,首先要知道對(duì)方的IP
携冤,然后怎么知道是設(shè)備上的哪個(gè)程序悼粮,那么需要知道端口
,到此就能正確的找到是哪個(gè)設(shè)備哪個(gè)程序了曾棕。那么消息怎么傳輸呢扣猫?因此可以選擇TCP
、UDP
翘地。而傳輸數(shù)據(jù)實(shí)際上就是將其序列化成0
1
的過(guò)程申尤,有Json
、Xml
衙耕、Protobuf
三種選擇昧穿;其差異見(jiàn)App網(wǎng)絡(luò)傳輸協(xié)議json xml protobuf。iOS
實(shí)現(xiàn)socket有調(diào)用OS底層C的BSD Socket
橙喘、基于原生Socket封裝的CocoaAsyncSocket
时鸵。由于筆者技術(shù)能力有限,所以在此使用的是CocoaAsyncSocket
+ Protobuf
Protobuf
編譯工具的安裝
使用命令行的方式來(lái)安裝厅瞎,打開(kāi)終端
// 查看是否安裝homebrew
brew -v
// 安裝homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
// 安裝automake
brew install automake
// 安裝libtool
brew install libtool
// 安裝protobuf
brew install protobuf
使用CocoaPods
來(lái)CocoaAsyncSocket
與 Protobuf
的集成
1饰潜、打開(kāi)Xcode,新建項(xiàng)目LXIMDemo
和簸;打開(kāi)終端彭雾,cd到項(xiàng)目的根目錄,新建Podfile
文件比搭,輸入下面的內(nèi)容并保存
target 'LXIMDemo' do
platform :ios, '8.0'
use_frameworks!
pod 'CocoaAsyncSocket'
pod 'Protobuf'
end
2冠跷、在終端輸入pod install
后按回車(chē)
3、將.proto
文件編譯成objc
的.h
.m
文件身诺,因?yàn)榫幾g后的OC
文件是不支持ARC
的蜜托,所以需要在targets->LXIMDemo->build phases->xxx.pbobjc.m添加-fno-objc-arc
// 編譯命令
protoc xxx.proto --objc_out="./"
至此準(zhǔn)備工作已完成。這也是筆者第一次寫(xiě)技術(shù)文章霉赡,如有問(wèn)題請(qǐng)指出橄务,與君共同學(xué)習(xí),共同進(jìn)步穴亏。
參考文章:
1蜂挪、socket是什么? https://blog.csdn.net/github_34606293/article/details/78230456
2、socket連接過(guò)程.png http://www.reibang.com/p/cf30e90c8269