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