輪詢:說白了就是客戶端定時去請求服務端, 是客戶端主動請求來促使數據更新;
長輪詢:說白了 也是客戶端請求服務端,但是服務端並不是即時返回,而是當有內容更新的時候才返回內容給客戶端,從流程上講,可以理解為服務器向客戶端推送內容;
從中大家可以看出區別:
輪詢:
1:大量耗費服務器內存和寬帶資源,因為不停的請求服務器,很多時候 並沒有新的數據更新,因此絕大部分請求都是無效請求
2:數據不一定是實時更新,要看設定的請求間隔,基本會有延遲。
長輪詢:
1:解決了輪詢的兩個大問題,數據實時更新;
2:唯一的缺點是服務器在掛起的時候比較耗內存;
總體而言,比輪詢進步了一大大大步
廢話不多說,上代碼(最簡單的小例子)
客戶端
<body>
<label id="lbLongPolling"></label>
<br />
<label id="lbNoLongPolling"></label>
<script>
$(function () {
//長輪詢,請求服務端,等到響應了,再次請求
var SendLongPolling = function () {
$.get("../Home/LongPolling", function (data) {
debugger;
$("#lbLongPolling").html("長輪詢:" + data);
SendLongPolling();
});
};
SendLongPolling();
//輪詢,不管三七21,每隔1秒就請求一次
setInterval(function () {
debugger;
$.get("../Home/NoLongPolling", function (data) {
debugger;
$("#lbNoLongPolling").html("輪詢:" + new Date().toLocaleString());
});
}, 1000);
})
</script>
</body>
服務端:
/// <summary> /// 長輪詢,模擬掛起的操作,服務器每秒會有更新,然后返回給客戶端實時數據 /// </summary> /// <returns></returns> public ActionResult LongPolling() { while (true) { Thread.Sleep(1000); return Content(DateTime.Now.ToString()); } } /// <summary> /// 輪詢,只要客戶端請求就返回數據 /// </summary> /// <returns></returns> public ActionResult NoLongPolling() { return Content(DateTime.Now.ToString()); }
例子雖然小,但是應該看得比較清楚了,服務端掛起的那里 也許模擬的不太好,期待園友們指正交流!
效果圖

