- | 短輪詢 | 長輪詢 | iframe流 | Flash Socket |
---|---|---|---|---|
輪詢 | 客戶端定時向服務器發送Ajax請求,服務器接到請求後立刻返回響應信息並關閉鏈接。 | 客戶端向服務器發送Ajax請求,服務器接到請求後hold住鏈接,直到有新消息才返回響應信息並關閉鏈接,客戶端處理完響應信息後再向服務器發送新的請求 | 頁面裏嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設爲對一個長鏈接的請求或是採用xhr請求,服務器端就能源源不斷地往客戶端輸入數據 | 頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript經過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通訊 |
優勢 | 後端程序編寫比較容易。 | 在無消息的狀況下不會頻繁的請求,耗費資源小 | 瀏覽器兼容好 | 實現真正的即時通訊,而不是僞即時。消息即時到達,不發無用請求 |
缺點 | 浪費帶寬和服務器資源。 | 服務器維護一個長鏈接會增長開銷 | IE、Mozilla Firefox會顯示加載沒有完成,圖標會不停旋轉。服務器維護一個長鏈接會增長開銷。 | 客戶端必須安裝Flash插件;非HTTP協議,沒法自動穿越防火牆 |
實例 | 適於小型應用。 | WebQQ、Hi網頁版、Facebook IM。 | Gmail聊天 | 網絡互動遊戲 |
當有新消息時服務端會向iframe中輸入一段js代碼.:javascript
println("<script>父級函數('" + 數據 +"<br>')</script>」);
用於調用父級函數傳數據。html
以socket.io爲例子
var app = require('koa')(); var server = require('http').createServer(app.callback()); var io = require('socket.io')(server); io.on('connection', function(){ // listen to the event socket.on('eventB', function(){ /* */ }); // emit an event to the socket socket.emit('eventA', /* */); }); server.listen(3000);
<script src="http://localhost:3000/socket.io/socket.io.js"></script> <script> var socket = new io() socket.on('eventA', function (res) { console.log('⽤戶1接收到信息了了') }) socket.emit('eventB', data) </script>
本身實現的一個demo,算是簡易版的你畫我猜
地址在這( https://github.com/jamielhf/n...
HTTP 協議沒法作到服務器主動推送信息。可是,有一種變通方法,就是服務器向客戶端聲明,接下來要發送的是流信息(streaming)。前端
也就是說,發送的不是一次性的數據包,而是一個數據流,會接二連三地發送過來。這時,客戶端不會關閉鏈接,會一直等着服務器發過來的新的數據流,視頻播放就是這樣的例子。本質上,這種通訊就是以流信息的方式,完成一次用時很長的下載。java
if(typeof(EventSource)!=="undefined") { var source=new EventSource("http://localhost:3001/stream"); // onopen onerror source.onmessage=function(event) { document.getElementById("result").innerHTML+=event.data + "<br>"; }; } else { document.getElementById("result").innerHTML="抱歉,你的瀏覽器不支持 server-sent 事件..."; }
var http = require("http"); http.createServer(function (req, res) { var fileName = "." + req.url; if (fileName === "./stream") { res.writeHead(200, { "Content-Type":"text/event-stream", "Cache-Control":"no-cache", "Connection":"keep-alive", "Access-Control-Allow-Origin": '*', }); res.write("data: " + (new Date()) + "\n\n"); interval = setInterval(function () { res.write("data: " + (new Date()) + "\n\n"); }, 1000); req.connection.addListener("close", function () { clearInterval(interval); }, false); } }).listen(3001, "127.0.0.1");
Websocket | SSE(Server-Sent Events) | |
---|---|---|
通信方式 | 基於TCP長鏈接通信 | http |
優勢 | 全雙工通信協議,性能開銷小、安全性高,有必定可擴展性 | 實現簡便,開發成本低,默認支持斷線重連 |
缺點 | 傳輸數據須要進行二次解析,增長開發成本及難度 | 瀏覽器兼容問題,單向 |
看完讓你完全搞懂Websocket原理
https://www.zhihu.com/questio...
Server-Sent Events 教程node