1. 程式人生 > >java web 伺服器推送技術 comet實現(原理)

java web 伺服器推送技術 comet實現(原理)

最近對伺服器推送技術比較感興趣,在網上也看了好些文章,由於每個人理解的不同,實現細節或者語言表達方式不同,本人被各種名詞或者技術實現搞的頭大,於是自己準備整理下。

首先實現伺服器推送技術一直一來是B/S應用開發的一塊難題,因為是基於HTTP協議的,HTTP協議為無狀態,單向性的協議,這種情況導致只有客戶端請求,伺服器才能被動響應結果,雖然HTTP協議的優勢是很大的,高效,高伸縮性等。但是有優勢自然有不足,譬如我想做個聊天室,這種情況導致伺服器無法主動向客戶端推送訊息,這就有了瓶頸。

....於是人們就開始尋找各種解決方案了。

一種就是控制客戶端的頁面不斷的進行ajax請求,應該很好實現吧。js定時器就可以實現,每次請求如果伺服器端有更新資料則響應到客戶端。但是這會造成伺服器的嚴重壓力,如果線上使用者數量過多的話,每隔個一兩秒請求一次,哪個伺服器能受得了,這種肯定不太現實,或者是最無奈的實現方法。

於是出現了 comet ,comet技術是伺服器推技術的一個總稱,但不是具體實現方式。下面我將會講兩種實現方式,是基於HTTP長連線的實現。

第一種叫做長輪詢(long-polling)方式,它同樣使用的ajax,簡單說一下,就是客戶端使用ajax傳送一個請求,伺服器端肯定會開啟一個執行緒,這個執行緒會時時監測要請求的資料是否有變化,如果有變化,則向客戶端輸出最新訊息,並關閉連結,客戶端收到訊息處理之後,再次向伺服器端請求,如此迴圈,所以叫長輪詢,這種實現方式比起上一種自然要好的多了,不需要客戶端不斷的ajax請求,減輕伺服器端的一定壓力,而且可以算得上是實時的。

另外一種是流方式,這種和長輪詢方式挺像,只有一點區別,就是流方式是在客戶端請求服務端並建立連結之後,伺服器端始終不會關閉連結(直到超時,斷電或者其他特殊情況)每次有資料時,就向客戶端進行輸出,而不像長輪詢每次向客戶端輸出之後,都要關閉連結。

關於長輪詢和流方式注意以下:

在長輪詢方式下,客戶端是在 XMLHttpRequest 的 readystate 為 4(即資料傳輸結束)時呼叫回撥函式,進行資訊處理。當 readystate 為 4 時,資料傳輸結束,連線已經關閉,長輪詢方式IE、Mozilla FireFox 都支援。而至於流方式,Mozilla Firefox 提供了對流方式的支援,即 readystate 為 3 時(資料仍在傳輸中),客戶端可以讀取資料,從而無須關閉連線,就能讀取處理伺服器端返回的資訊。IE 在 readystate 為 3 時,不能讀取伺服器返回的資料,目前 IE 不支援流方式。

comet實現瓶頸解決——伺服器servlet執行緒阻塞問題

到這裡大家可能會想到另外一個問題,那就是客戶端每來一個請求,都要在伺服器端開一個執行緒來監測資料是否發生變化,即使資料很長時間內都不會發生改變,這條執行緒依然 在這裡阻塞著,資源不能得到釋放,執行緒在這裡又沒其他事幹,如果有過多的使用者、過多的執行緒,自然會造成伺服器的資源,記憶體不足的情況。這是個問題,不過既然有問題,自然有解決方法。 目前有兩種解決方法,第一種是利用Tomcat 和 Jetty這兩種開源伺服器對NIO的支援 程式碼實現和新增伺服器支援可以參考http://www.ibm.com/developerworks/cn/web/wa-cometjava/,第二種則是Java 1.6 出來的Servlet3.0,Servlet3.0可以實現真正的非同步處理,就是新開一個執行緒用於處理複雜業務,而servlet執行緒本身則繼續往下執行直到結束之後,再返回servlet容器,待到另一條執行緒業務處理完之後,再向客戶端輸出結果。但是使用servlet3.0,需要tomcat7和以上才支援,servlet3.0的實現百度就有好多,就不在此多贅述了。只談理論。。。 

相關推薦

java web 伺服器技術 comet實現原理

最近對伺服器推送技術比較感興趣,在網上也看了好些文章,由於每個人理解的不同,實現細節或者語言表達方式不同,本人被各種名詞或者技術實現搞的頭大,於是自己準備整理下。 首先實現伺服器推送技術一直一來是B/S應用開發的一塊難題,因為是基於HTTP協議的,HTTP協議為無狀態,單

java技術的選擇

java推送技術 這段時間一直在做關於伺服器端向APP端推送訊息,查閱了大量的資料,這裡做下總結。 關於推送我們常見的推送有APP外推送,APP內推送。APP外推送有各大平臺極光,友盟等,而APP內的推送可以用的服務基本需要自己去實現,這裡我給大家介紹的就是

.NET基於comet伺服器技術(web實時聊天)

Comet 也稱反向 Ajax 或伺服器端推技術.其思想很簡單:將資料直接從伺服器推到瀏覽器,而不必等到瀏覽器請求資料。 主要思想:伺服器端將資料推送到客戶端(瀏覽器) 系統簡單說明如下: { 系統所用資料庫:sqlite資料庫   UserInfo:使用者資訊表

ASP.NET Web實時訊息後臺伺服器技術--GoEasy

越來越多的專案需要用到實時訊息的推送與接收,怎樣用asp.net實現最方便呢?我這裡推薦大家使用GoEasy, 它是一款第三方推送服務平臺,使用它的API可以輕鬆搞定實時推送! 瀏覽器相容性:GoEasy推送 支援websocket 和polling兩種連線方式,從而可以支

web聊天程式,ajax+伺服器技術

web聊天技術一般用ajax請求伺服器,方式有多種,比如定時幾秒請求一次,或長連線什麼的。我個人還是喜歡“伺服器推”這種模式,它不用定幾秒請求一次讓伺服器大大減壓。長連線什麼這個不懂什麼意思不管了(額,不知道”伺服器推“屬於哪一種)。 "伺服器推送",是指當有訊息時就把訊息

PHP Web實時訊息後臺伺服器技術--GoEasy

越來越多的專案需要用到實時訊息的推送與接收,怎樣用PHP實現最方便呢?我這裡推薦大家使用GoEasy, 它是一款第三方推送服務平臺,使用它的API可以輕鬆搞定實時推送! 瀏覽器相容性:GoEasy推送 支援websocket 和polling兩種連線方式,從而可以支援IE

伺服器技術

什麼是伺服器推送技術 推送技術是指通過客戶端與伺服器端建立長連結,客戶端可以接收由伺服器端不定時傳送的訊息。 解決方案 1.Ajax短輪詢 2.Ajax長輪詢 3.WebSocket 短輪詢 Ajax短輪詢:http 短輪詢是 server 收到請求不管是否有資料

JavaEE開發之SpringMVC中的靜態資源對映及伺服器技術

在上篇部落格中,我們聊了《》。本篇部落格我們繼續的來聊SpringMVC的東西,下方我們將會聊到js、css這些靜態檔案的載入配置,以及伺服器推送的兩種實現方式。當然我們在伺服器推送時,會用到JQuery的東西,所以我們先聊一下如何載入靜態資原始檔,然後我們再聊如何實現伺服器推送。 下方給出了兩種實現伺服器推

HTML5中的伺服器技術 -Server-Sent Events

一直以來,HTTP協議都是嚴格遵循Request-Response模型的。客戶端傳送一個Request到伺服器,伺服器對Request作出響應並將Response傳送回客戶端。也就是說,所有的互動都是由客戶端發起的,伺服器不會發起任何互動。為了建立互動性更強的web應用程

伺服器技術之——SSE

一 點睛 伺服器推送技術在日常開發中較為常用。 SSE:Server send Event:服務端傳送事件。 本專案推送技術是基於:當客戶端向服務端傳送請求,服務端會抓住這個請求不放,等有資料更新的時候才返回給客戶端,當客戶端接收到訊息後,再向服務端傳送請求,周而復始。

goEasy伺服器技術

發現一個伺服器推送和牛逼的 就是連結數如果達到一定量級的話就要收費的。 廢話不多說,直接進入正題,如何實現: 1. 從GoEasy獲取appkey appkey是驗證使用者的有效性的唯一標識。 用註冊好的賬號登入到GoEasy的後臺管理系統,建立您自己應用(

Android開發-在Android應用裡整合友盟訊息SDK的實現相容小米、華為、魅族機型離線

前 言 最近由於專案的功能需求的需要,需要在Android應用整合訊息推送的功能,而目前市面上的第三方訊息推送除了友盟推送外,還有極光推送、小米推送、個推以及信鴿(騰訊)推送等。當時本人對比各大第三方的訊息推送進行了測試,覺得友盟訊息推送整合簡單,推送訊息的

Java關於傳統的excel匯出的實現

匯出的excel如下: 如果沒有特殊的格式啥的要求,此方法已經滿足,如果遇到標題或者定製的那種內容,就需要改造此方法!注意一下,這個方法只適合簡單的匯出使用。如果那種定製模板的匯出,在下一篇文章中我會有給出方法! 第一,控制層(controller層)的程式碼如下: /** * 列

基於java的微信小程式的實現視訊首頁的前後端開發

1.效果演示 2.編寫分頁查詢全部視訊的介面開發 1.需求分析 該介面會查詢資料庫中全部的視訊內容,因為視訊內容過多,要採用分頁查詢,這裡我們使用Pageable對查詢結果進行分頁處理,另外,在前端顯示視訊的內容時候還需要額外的顯示使用者的頭像和暱稱資訊,所以在進行視訊列表

基於java的微信小程式的實現使用者視訊上傳的前後端開發

1.使用者上傳視訊功能需求分析 使用者在登入之後可以在個人資訊頁面點選上傳視訊按鈕,會讓使用者在本地選擇一段視訊進行上傳,視訊不能過長,選擇好後,使用者會跳轉到選擇背景音樂的介面,可以選擇為該視訊加上一段背景音樂,並且可以對該視訊做相關描述,然後點選上傳視訊按鈕,完成視訊上傳。 2.

基於java的微信小程式的實現使用者個人資訊小程式端開發

1.個人資訊頁面展示 2.顯示個人資訊功能 1.需求分析 在該頁面首先需要在載入完畢後去呼叫後端的查找個人資訊的介面,並將返回的值回顯到個人資訊頁面上 2.js程式碼的編寫 onLoad:function(params){ var me=this;

基於java的微信小程式的實現使用者個人資訊相關介面開發

1.查詢使用者個人資訊介面開發 1.需求分析 需要通過前端傳來的使用者的userid去資料庫中進行查詢,並將查詢到的物件封裝為usersVo返回給前端 dao層程式碼 public interface UsersDao extends JpaRepository<Use

基於java的微信小程式的實現登入,註冊,注小程式端的實現

1.微信小程式專案結構認識 js檔案用來寫相關的邏輯操作,主要是用來操作資料 json檔案用來寫一些相關的配置 wxss相當於css用來寫頁面樣式 wxml相當於html用來寫頁面的元素的 pages資料夾中可以存放多個資料夾,每個資料夾裡面都是一套是js,json

基於java的微信小程式的實現登入,註冊,登出介面的實現

1.開發工具以及相關環境的配置 1.首先關於IDE,前端小程式端採用的是微信官方的微信開發者工具,後端使用的是idea(idea是真的智慧,再也不想回去eclipse了呢),關於前端的一些程式碼,主要是參照微信官方的API進行開發的,整體的檔案結構也和js,css,html也很相似。

基於java的微信小程式的實現專案介紹

一,專案介紹 佐倉短視訊是一個以java為後臺編寫的短視訊類的微信小程式專案 使用者可以實現登入,註冊,視訊檢視,視訊上傳,個人資訊檢視,頭像上傳等功能 二,技術選型和效果預覽 本專案後端採用spring boot +spring data jpa的技術實現