利用Ajax實現長串連(類比推送)

來源:互聯網
上載者:User

本文非原創,點擊查看原帖

      很多程式都可以通過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,效果很帥。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.