傳統的http協議有個缺點,就是隻能由客戶端不斷地主動發起請求,服務端才把信息返回到客戶端,服務端是不會主動給客戶端發消息的,這就是傳統的單向請求,web
而websocket是雙向的,在單個 TCP 鏈接上進行全雙工通信,先後端會有一次握手,握手一旦成功後,只要有消息,服務端就會實時的推送給客戶端,客戶端不須要每一次去發問,WebSocket 只須要創建一次鏈接,就能夠一直保持鏈接狀態。這相比於輪詢方式的不停創建鏈接顯然效率要大大提升。segmentfault
如下是websocket的一些特色後端
(1)創建在 TCP 協議之上,服務器端的實現比較容易。
(2)與 HTTP 協議有着良好的兼容性。默認端口也是80和443,而且握手階段採用 HTTP 協議,所以握手時不容易屏蔽,能經過各類 HTTP 代理服務器。
(3)數據格式比較輕量,性能開銷小,通訊高效。
(4)能夠發送文本,也能夠發送二進制數據。
(5)沒有同源限制,客戶端能夠與任意服務器通訊。
(6)協議標識符是ws(若是加密,則爲wss),服務器網址就是 URL。瀏覽器
在服務端
WebSocket 在服務端的實現很是豐富。Node.js、Java、C++、Python 等多種語言都有本身的解決方案。
基於多線程或多進程的服務器沒法適用於 WebSockets,由於它旨在打開鏈接,儘量快地處理請求,而後關閉鏈接。任何實際的 WebSockets 服務器端實現都須要一個異步服務器。
WebSocket 代理
若是把 WebSocket 的通訊當作是電話鏈接,Nginx 的角色則像是電話接線員,負責將發起電話鏈接的電話轉接到指定的客服。服務器
Nginx 從 1.3 版開始正式支持 WebSocket 代理。若是你的 web 應用使用了代理服務器 Nginx,那麼你還須要爲 Nginx 作一些配置,使得它開啓 WebSocket 代理功能。websocket
如下爲參考配置:多線程
server { // this section is specific to the WebSockets proxying location /socket.io { proxy_pass http://app_server_wsgiapp/socket.io; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 600; } }
在客戶端
建立 WebSocket 對象。app
var Socket = new WebSocket(url, [protocol] );
以上代碼中的第一個參數 url, 指定鏈接的 URL。第二個參數 protocol 是可選的,指定了可接受的子協議異步
WebSocket對象的2個屬性(都是隻讀)socket
readyState bufferedAmount
WebSocket對象的4個事件
open message error close
WebSocket對象的2個方法
send() close()
示例
// 初始化一個 WebSocket 對象
var ws = new WebSocket('ws://localhost:9998/echo');
// 創建 web socket 鏈接成功觸發事件
ws.onopen = function() {
// 使用 send() 方法發送數據
ws.send('發送數據');
alert('數據發送中...');
};
// 接收服務端數據時觸發事件
ws.onmessage = function(evt) {
var received_msg = evt.data;
alert('數據已接收...');
};
// 斷開 web socket 鏈接成功觸發事件
ws.onclose = function() {
alert('鏈接已關閉...');
};
兼容問題
使用以前看瀏覽器是否支持websocket協議
對於低端不支持websocket的瀏覽器,通常有幾個解決方案
//判斷瀏覽器是否支持websocket 支持返回true
function check_support_websocket() {
return typeof WebSocket != 'undefined';
}
1.使用輪詢或長鏈接的方式實現僞websocket的通訊
2.使用flash或其餘方法實現一個websocket客戶端 :https://segmentfault.com/q/1010000005000671/a-1020000005003936