不少網站爲了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每秒),由瀏覽器對服務器發出HTTP請求,而後由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器須要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會消耗不少的帶寬資源。php
在這種狀況下,HTML5定義了WebSocket協議,能更好的節省服務器資源和帶寬,而且可以更實時地進行通信。html
WebSocket是一種與HTTP不一樣的協議。二者都位於OSI模型的應用層。 雖然它們不一樣,但RFC 6455規定:「WebSocket設計爲經過80和443端口工做,以及支持HTTP代理和中介」,從而使其與HTTP協議兼容。
爲了實現兼容性,WebSocket握手使用HTTP Upgrade頭從HTTP協議更改成WebSocket協議。node
1.更強的實時性,全雙工。
2.與 HTTP 協議有着良好的兼容性。默認端口也是80和443,而且握階段採用 HTTP 協議,所以握手時不容易屏蔽,能經過各類 HTTP 代理服務器。
3.數據格式比較輕量,性能開銷小,通訊高效。
4.能夠發送文本,也能夠發送二進制數據。
5.保持鏈接狀態,省略部分狀態信息python
協議標識符是ws(若是加密,則爲wss,對應
HTTPS 協議),服務器網址就是 URL。ws://example.com:80/some/path
nginx
客戶端git
Connection: Upgrade Upgrade: websocket Host: 192.168.1.45:3000 Origin: http://localhost:8080 Sec-WebSocket-Key: w3XxUf6WUX94dfEesLmkOA== Sec-WebSocket-Version: 13
服務端github
Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s= Sec-WebSocket-Origin: null Sec-WebSocket-Location: ws://192.168.1.45:3000
創建鏈接和斷開鏈接
發送數據和接收數據
處理錯誤
var ws = new WebSocket("ws://192.168.1.45:3000/echo"); ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!"); }; ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close(); }; ws.onclose = function(evt) { console.log("Connection closed."); };
php - http://code.google.com/p/phpwebsocket/ jetty - http://jetty.codehaus.org/jetty/(版本7開始支持websocket) netty - http://www.jboss.org/netty ruby - http://github.com/gimite/web-socket-ruby Kaazing - https://web.archive.org/web/20100923224709/http://www.kaazing.org/confluence/display/KAAZING/Home Tomcat - http://tomcat.apache.org/(7.0.27支持websocket,建議用tomcat8,7.0.27中的接口已通過時) WebLogic - http://www.oracle.com/us/products/middleware/cloud-app-foundation/weblogic/overview/index.html(12.1.2開始支持) node.js - https://github.com/Worlize/WebSocket-Node(demo中使用) node.js - http://socket.io nginx - http://nginx.com/ mojolicious - http://mojolicio.us/ python - https://github.com/abourget/gevent-socketio Django - https://github.com/stephenmcd/django-socketio erlang - https://github.com/ninenines/cowboy.git