http環境本身是一種無連線狀態的架構,在這種架構下伺服器只能是被動的接受客戶端的請求,返回結果,而無法主動的給客戶端傳送資料。而在很多需要實時資料互動(比如web im)的場景中,我們卻希望能及時得到伺服器給我們返回的資料。此時,一種最為普遍的做法是:在客戶端用定時器,定時去請求伺服器的服務,來得到最新資料。而這樣一來,很多時候卻是在做無用功,頻繁的請求也會無端的增加伺服器和客戶端在請求web服務上的消耗。那麼是否有一種更好的辦法,既可以及時得到伺服器的返回,同時又可以減少做無用功,以及頻繁請求帶來的效能問題呢?
記得前不久,在園子裡有這樣的一篇文章,介紹了幾種web環境定時重新整理資料的機制。其中就有提到google gmail的一種比較巧妙的做法,現在記不得當時是怎麼理解這種做法了,只記得有「保持長連線」的基本做法。(當然現在也找不到這篇文章了,希望了解的朋友能提醒一下)。今天由於架構方案的需要,再來仔細思考連線保持方案,以及參考gmail的請求行為,總結了一下,應該是這樣的:客戶端一直保持乙個與伺服器的連線,這個連線一直保持著對伺服器的請求動作,直到伺服器發現有資料後給它返回後,才結束返回這一次請求。客戶端在接收到請求返回後,在處理這些返回之前,又向伺服器傳送了一次連線請求,直到下一次有資料返回。不可避免的有一種情況,就是如果伺服器長時間沒有需要給客戶端傳送資料的話,那麼可以就會造成請求失敗(超時或其它原因)。對於這種情況的處理也是一樣的,在錯誤的**事件中重新傳送一次請求連線。這樣就可以模擬保持連線狀態了。
用偽**來描述一下思路吧:
客戶端指令碼:
1:function request()
2:
5:function onsuccessed(response)
6:
11:function onfailed()
12:
web服務:
void processrequest(httpcontext context)
5:
15: thread.sleep(500);//等待一段時間再重新讀取。
16: }
17: }
18:private
string getmessage()
19:
22: }
這種方案的好處有:客戶端可以第一時間得到伺服器需要給客戶端傳送的資料(而至於web服務怎麼知道要給客戶端傳送資料,也就是伺服器的輪循設計,則是另乙個需要考慮的方案);可以減化客戶端邏輯,無需要建立和釋放定時器,並減小由此產生的對客戶端效能的損失;減少去伺服器的請求次數,減少做無用功,節約節省頻寬和減少伺服器資源需要處理的連線請求。
補充:伺服器部分的設計,除了使用輪循外,也可以考慮使用資源互斥訪問的方式來設計,這樣做可以獲得更佳效能,更高實時性,具體的方案應當根據實際情況來考慮。
IIS 保持 HTTP 連線 預設開啟
大多數 web 瀏覽器要求伺服器在多個請求中保持連線開啟。這被稱為保持 http 連線。保持連線是乙個 http 規範,它能夠顯著增 強伺服器效能。如果沒有它,瀏覽器將必須為包含多個元素 如圖形 的頁進行大量的連線請求。可能需要為每個元素進行單獨連線 這些額外的請求和連線要求額外的伺服器活動和資源,...
MTK的HTTP連線方式
mtk使用socket來實現http的請求。mtk平台中socket建立步驟 1 soc create 建立socket,成功後將返回乙個socket id供下面的函式使用,成功執行在手機上的效果是開啟黃色邊框的gprs圖示,對應手機nwk account id的值有10和14,分別代表網路接入點c...
IIS中保持HTTP連線的設定方法
大多數 web 瀏覽器要求伺服器在多個請求中保持連線開啟。這被稱為保持 http 連線。保持連線是乙個 http 規範,它能夠顯著增強伺服器效能。如果沒有它,瀏覽器將必須為包含多個元素 如圖形 的頁進行大量的連線請求。可能需要為每個元素進行單獨連線。這些額外的請求和連線要求額外的伺服器活動和資源,這...