序章

我們要做一個(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ù))

image

socket連接過(guò)程

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è)程序了曾棕。那么消息怎么傳輸呢扣猫?因此可以選擇TCPUDP翘地。而傳輸數(shù)據(jù)實(shí)際上就是將其序列化成0 1的過(guò)程申尤,有JsonXml衙耕、Protobuf三種選擇昧穿;其差異見(jiàn)App網(wǎng)絡(luò)傳輸協(xié)議json xml protobufiOS實(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)CocoaAsyncSocketProtobuf的集成
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗓化,一起剝皮案震驚了整個(gè)濱河市棠涮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刺覆,老刑警劉巖严肪,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驳糯,警方通過(guò)查閱死者的電腦和手機(jī)篇梭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酝枢,“玉大人恬偷,你說(shuō)我怎么就攤上這事×蹦溃” “怎么了袍患?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)官脓。 經(jīng)常有香客問(wèn)我协怒,道長(zhǎng),這世上最難降的妖魔是什么卑笨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任孕暇,我火速辦了婚禮,結(jié)果婚禮上赤兴,老公的妹妹穿的比我還像新娘妖滔。我一直安慰自己,他們只是感情好桶良,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布座舍。 她就那樣靜靜地躺著,像睡著了一般陨帆。 火紅的嫁衣襯著肌膚如雪曲秉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天疲牵,我揣著相機(jī)與錄音承二,去河邊找鬼。 笑死纲爸,一個(gè)胖子當(dāng)著我的面吹牛亥鸠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播识啦,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼负蚊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了颓哮?” 一聲冷哼從身側(cè)響起家妆,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冕茅,沒(méi)想到半個(gè)月后伤极,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腰鬼,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年塑荒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姜挺。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡齿税,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炊豪,到底是詐尸還是另有隱情凌箕,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布词渤,位于F島的核電站牵舱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缺虐。R本人自食惡果不足惜芜壁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望高氮。 院中可真熱鬧慧妄,春花似錦、人聲如沸剪芍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罪裹。三九已至饱普,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間状共,已是汗流浹背套耕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留口芍,地道東北人箍铲。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鬓椭,于是被迫代替她去往敵國(guó)和親颠猴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫(kù)編程小染,其封裝好的開(kāi)源庫(kù)是 cocoa AsyncSocket庫(kù)翘瓮,用它...
    Ethan_Struggle閱讀 2,247評(píng)論 2 12
  • 參考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麥子閱讀 2,952評(píng)論 0 14
  • 一: 網(wǎng)絡(luò)各個(gè)協(xié)議:TCP/IP、SOCKET呵扛、HTTP 網(wǎng)絡(luò)七層由下往上分別為物理層每庆、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層今穿、傳輸層...
    iYeso閱讀 1,439評(píng)論 0 13
  • 1缤灵、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)、netstat -nat 查看TCP各個(gè)狀態(tài)的數(shù)量2)蓝晒、lso...
    北辰青閱讀 9,437評(píng)論 0 11
  • 鄙人又來(lái)和大家分享手賬の秘密啦~ 以下是整理的一些小小の建議*當(dāng)然僅供參考*希望大家喜歡~*?(?′?`?)...
    槐序cherry閱讀 410評(píng)論 2 3