Web客戶端與伺服器之間基於Ajax(http)的常用通信方式,分為短連接與長輪詢。 短連接:客戶端和伺服器每進行一次HTTP操作,就建立一次連接,任務結束就中斷連接。 在長輪詢機制中,客戶端像傳統輪詢一樣從伺服器請求數據。然而,如果伺服器沒有可以立即返回給客戶端的數據,則不會立刻返回一個空結果, ...
Web客戶端與伺服器之間基於Ajax(http)的常用通信方式,分為短連接與長輪詢。
短連接:客戶端和伺服器每進行一次HTTP操作,就建立一次連接,任務結束就中斷連接。
在長輪詢機制中,客戶端像傳統輪詢一樣從伺服器請求數據。然而,如果伺服器沒有可以立即返回給客戶端的數據,則不會立刻返回一個空結果,
而是保持這個請求等待數據到來(或者恰當的超時:小於ajax的超時時間),之後將數據作為結果返回給客戶端。
長輪詢機制如下圖所示:
web客戶端代碼如下:
//向後臺長輪詢消息 function longPolling(){ $.ajax({ async : true,//非同步 url : 'longPollingAction!getMessages.action', type : 'post', dataType : 'json', data :{}, timeout : 30000,//超時時間設定30秒 error : function(xhr, textStatus, thrownError) { longPolling();//發生異常錯誤後再次發起請求 }, success : function(response) { message = response.data.message; if(message!="timeout"){ broadcast();//收到消息後發佈消息 } longPolling(); } }); }
web伺服器端代碼如下:
public class LongPollingAction extends BaseAction { private static final long serialVersionUID = 1L; private LongPollingService longPollingService; private static final long TIMEOUT = 20000;// 超時時間設置為20秒 public String getMessages() { long requestTime = System.currentTimeMillis(); result.clear(); try { String msg = null; while ((System.currentTimeMillis() - requestTime) < TIMEOUT) { msg = longPollingService.getMessages(); if (msg != null) { break; // 跳出迴圈,返回數據 } else { Thread.sleep(1000);// 休眠1秒 } } if (msg == null) { result.addData("message", "timeout");// 超時 } else { result.addData("message", msg); } } catch (Exception e) { e.printStackTrace(); } return SUCCESS; } public LongPollingService getLongPollingService() { return longPollingService; } public void setLongPollingService(LongPollingService longPollingService) { this.longPollingService = longPollingService; } }