在標(biāo)準(zhǔn)的HTTP模型中碟联,服務(wù)器無法與客戶端啟動連接妓美、發(fā)送未經(jīng)請求的HTTP響應(yīng)給客戶端,因此鲤孵,為了盡快接收異步事件壶栋,就需要服務(wù)器能在不等待的情況下向客戶端發(fā)送更新消息,目前主要存在以下幾種方法:
長/短輪詢:(客戶端拉動)
Iframe流:(服務(wù)端推送)
SSE:(服務(wù)端推送)
Websocket:(服務(wù)端推送)
輪詢
輪詢是客戶端定期向服務(wù)端請求新數(shù)據(jù)的一種技術(shù)普监,主要分為短輪詢和長輪詢贵试。
? ? 短輪詢: 基于Ajax請求的計時器,固定延時調(diào)用凯正;
? ? 長輪詢:基于Comet(是一種用于web的推送技術(shù)毙玻,能使服務(wù)器實時地將更新的信息傳送到客戶端,而無須客戶端發(fā)出請求)廊散,建立連接后桑滩,一直等待服務(wù)端有數(shù)據(jù)之后的響應(yīng)(或超時),返回后再重新連接允睹;
Iframe流(HTTP流式傳輸)
iframe流是在頁面中插入一個隱藏的iframe运准,利用其src屬性在服務(wù)器和客戶端之間創(chuàng)建一條長連接,服務(wù)器向iframe傳輸數(shù)據(jù)(通常是HTML缭受,對客戶端js的調(diào)用)來實時更新頁面胁澳。
Tip:輪詢和Iframe流都屬于Comet,一種用于web的推送技術(shù)贯涎,能使服務(wù)器實時地將更新的信息傳送到客戶端听哭,而無需客戶發(fā)出請求
SSE
Server-Send Events 實現(xiàn)了客戶端請求服務(wù)端慢洋,然后服務(wù)端利用與客戶端建立的這條通信連接push數(shù)據(jù)給客戶端塘雳,客戶端接收數(shù)據(jù)并處理陆盘。
本質(zhì):以流信息的方式通信,完成一次用時很長的下載败明。
特點:
? ? 1. 使用HTTP協(xié)議隘马,現(xiàn)有的服務(wù)器軟件都支持;
? ? 2. 輕量級妻顶,使用簡單酸员;
? ? 3. 默認(rèn)支持?jǐn)嗑€重連,Websocket需要自己實現(xiàn)讳嘱;
? ? 4. 一般只用來傳送文本幔嗦,二進(jìn)制數(shù)據(jù)需要編碼后傳送;
? ? 5. 支持自定義發(fā)送的消息類型沥潭。
Websocket
Websocket是一種應(yīng)用層協(xié)議邀泉,提供了客戶端和服務(wù)端之間全雙工通信機制。
特點:
? ? ?1. 服務(wù)器可以主動向客戶端推送消息钝鸽,客戶端也可以主動向服務(wù)器發(fā)送信息汇恤;
? ? ?2. 建立在TCP協(xié)議之上,服務(wù)器端的實現(xiàn)比較容易拔恰;
? ? ?3. 沒有同源限制因谎,客戶端可以與任意服務(wù)器通信;
? ? ?4. 協(xié)議標(biāo)識符是ws(如果加密颜懊,則為wss)财岔,服務(wù)網(wǎng)址就是URL
? ? ?5. 默認(rèn)支持傳送二級制數(shù)據(jù),也可以傳輸文本河爹。