很多程序都可以通過(guò)socket來(lái)實(shí)現(xiàn)長(zhǎng)連接,實(shí)現(xiàn)消息的即時(shí)推送。但由于http請(qǐng)求一般都是短連接,一次請(qǐng)求結(jié)束,就會(huì)斷開(kāi)與服務(wù)器的連接,服務(wù)器不能主動(dòng)推送數(shù)據(jù)到客戶端,而只能由客戶端發(fā)起請(qǐng)求,但有些時(shí)候,需要在web上實(shí)現(xiàn)即時(shí)的消息傳輸,比如即時(shí)聊天、股票動(dòng)態(tài)信息等。
在Ajax技術(shù)被發(fā)掘以前,在網(wǎng)頁(yè)上實(shí)現(xiàn)無(wú)刷新的即時(shí)聊天,似乎是很困難的事情,但由于Ajax技術(shù)的興起,人們可以進(jìn)一步來(lái)挖掘它的潛力了,象gmail、google gtalk的網(wǎng)頁(yè)版,都是Ajax長(zhǎng)連接的重要應(yīng)用,目前很多網(wǎng)站可能都已經(jīng)在使用長(zhǎng)連接技術(shù)了,比如SNS網(wǎng)站的即時(shí)聊天。
1.Ajax短連接方式實(shí)現(xiàn)網(wǎng)頁(yè)聊天
自己畫了一個(gè)模型圖:
常規(guī)的短連接模式下,都是通過(guò)不間斷刷新請(qǐng)求實(shí)現(xiàn)的,比如每間隔3秒發(fā)送一次Ajax請(qǐng)求,3秒更新一下數(shù)據(jù),然后就這樣不間斷刷新下去,直到用戶關(guān)閉網(wǎng)頁(yè)。這樣所帶來(lái)的弊端就是,如果用戶很長(zhǎng)時(shí)間都沒(méi)有操作,每次刷新都不會(huì)返回新數(shù)據(jù),這樣就造成了資源的浪費(fèi),很多請(qǐng)求都是沒(méi)必要的;另外一個(gè)問(wèn)題,就是用戶的輸入,跟數(shù)據(jù)的請(qǐng)求不是同步的,會(huì)造成一定的信息延遲。
2.Ajax長(zhǎng)連接方式實(shí)現(xiàn)網(wǎng)頁(yè)聊天
模型圖:
Ajax長(zhǎng)連接模式,它的刷新是根據(jù)數(shù)據(jù)來(lái)執(zhí)行的,如果有新數(shù)據(jù)返回,接收并解析顯示數(shù)據(jù),然后發(fā)起新的Ajax請(qǐng)求,如果一段時(shí)間內(nèi),用戶沒(méi)有操作,則連接處于睡眠狀態(tài),一直等待有用戶輸入或者請(qǐng)求超時(shí),然后發(fā)起下個(gè)Ajax請(qǐng)求。這樣做的好處是,每個(gè)消息都會(huì)即時(shí)推送到客戶端,延遲極少;另外每次請(qǐng)求都是有意義的,與短連接對(duì)比,效率要高很多。但對(duì)于一個(gè)用戶量很多,并且操作非常頻繁的網(wǎng)站,長(zhǎng)連接模式也會(huì)出現(xiàn)過(guò)于頻繁的刷新問(wèn)題。目前IE對(duì)于HTTP連接數(shù)是有限制的,每個(gè)網(wǎng)頁(yè)只能同時(shí)進(jìn)行兩個(gè)長(zhǎng)連接,第三個(gè)長(zhǎng)連接會(huì)被阻塞。
利用php在后臺(tái)sleep,自己做了個(gè)模擬的程序,查看效果
看了一下別人寫的Ajax長(zhǎng)連接聊天的案例,以php為例,基本上是在后臺(tái)進(jìn)行不間斷的檢測(cè),如果有新數(shù)據(jù)就推送,如果沒(méi)有新數(shù)據(jù),就一直阻塞,直到30秒超時(shí),然后客戶端重新發(fā)起下一個(gè)請(qǐng)求。后臺(tái)判斷里重要的一行代碼:usleep(10000); 就是暫停10毫秒,緩解一下CPU壓力,個(gè)人感覺(jué)如果暫停100毫秒,時(shí)間延遲也是很難感覺(jué)到的。這種方法基本就是把前端的循環(huán),搬到了后臺(tái),中間減少了網(wǎng)絡(luò)傳輸?shù)沫h(huán)節(jié),如果是一個(gè)Ajax的即時(shí)聊天系統(tǒng),要保存用戶的聊天記錄,那就需要跟數(shù)據(jù)庫(kù)相結(jié)合,每秒10次以上的數(shù)據(jù)查詢,這個(gè)與短連接比,必定加大了數(shù)據(jù)庫(kù)的壓力,具體怎么優(yōu)化,這個(gè)應(yīng)該是交給服務(wù)器端人員來(lái)處理了。
如果想要了解更多的內(nèi)容請(qǐng)Google一下comet,或者看看這里(一個(gè)很不錯(cuò)的框架,Ajax Push Engine),這個(gè)網(wǎng)站有很多demo,效果很帥。
新聞熱點(diǎn)
疑難解答
圖片精選