認識下websocket

WebSocket 的背景

不少網站爲了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每秒),由瀏覽器對服務器發出HTTP請求,而後由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器須要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會消耗不少的帶寬資源。php

在這種狀況下,HTML5定義了WebSocket協議,能更好的節省服務器資源和帶寬,而且可以更實時地進行通信。html

WebSocket 的簡介

WebSocket是一種與HTTP不一樣的協議。二者都位於OSI模型的應用層。 雖然它們不一樣,但RFC 6455規定:「WebSocket設計爲經過80和443端口工做,以及支持HTTP代理和中介」,從而使其與HTTP協議兼容。
爲了實現兼容性,WebSocket握手使用HTTP Upgrade頭從HTTP協議更改成WebSocket協議。node

image.png

WebSocket的優勢

1.更強的實時性,全雙工。
2.與 HTTP 協議有着良好的兼容性。默認端口也是80和443,而且握階段採用 HTTP 協議,所以握手時不容易屏蔽,能經過各類 HTTP 代理服務器。
3.數據格式比較輕量,性能開銷小,通訊高效。
4.能夠發送文本,也能夠發送二進制數據。
5.保持鏈接狀態,省略部分狀態信息python

協議標識符是ws(若是加密,則爲wss,對應
HTTPS 協議),服務器網址就是 URL。
ws://example.com:80/some/path
image.pngnginx

WebSocket 握手

image.png

image.png

客戶端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

WebSocket API

創建鏈接和斷開鏈接
發送數據和接收數據
處理錯誤
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.");
};

WebSocket 服務端的實現

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

WebSocket 搭建聊天室

在線體驗地址
先後端代碼web

相關文章
相關標籤/搜索