WebSocket是HTML5開始提供的一種在單個TCP連接上進行全雙工通訊的協議;
在WebSocket API中,瀏覽器和服務器只需要做一個握手的動作,然后,瀏覽器和服務器之間就形成了一條快速通道,兩者之間就直接可以數據互相傳送;
瀏覽器通過JavaScript向服務器發出建立WebSocket連接的請求,連接建立以后客戶端和服務器端就可以通過TCP連接直接交換數據;
當你獲取Web Socket連接后,你可以通過send()方法來向服務器發送數據,并通過 onmessage 事件來接受服務器返回的數據;
創建WebSocket對象
var Socket = new WebSocket(url, [protocol]);
以上代碼中的第一個參數 url,指定連接的URL;第二個參數 protocol是可選的,指定可接受的子協議。
WebSocket屬性
以下是WebSocket對象的屬性。假設已經創建了Socket對象;
屬性 | 描述 |
---|---|
Socket.readyState | 只讀屬性 readyState表示連接狀態,可以是以下值: 0 - 表示連接尚未成立 1 - 表示連接已建立,可以進行通訊; 2 - 表示連接正在進行關閉; 3 - 表示連接已經關閉或者連接不能打開; |
Socket.bufferedAmount | 只讀屬性 bufferedAmount 已被send()放入正在隊列中等待傳輸,但是還沒有發出的 UTF-8 文本字節數; |
WebSocket事件
以下是WebSocket對象的相關事件,假定已經創建了Socket對象;
事件 | 事件處理程序 | 描述 |
---|---|---|
open | Socket.onopen | 建立連接時觸發 |
message | Socket.onmessage | 客戶端接收服務端數據時觸發 |
error | Socket.onerror | 通信發生錯誤時觸發 |
close | Socket.onclose | 連接關閉時觸發 |
WebSocket方法
以下是WebSocket對象的相關方法,假定已經創建了Socket對象
方法 | 描述 |
---|---|
Socket.send() | 使用連接發送數據 |
Socket.close() | 關閉連接 |
WebSocket實例
WebSocket協議本質上是一個基于TCP的協議;
為了建立一個WebSocket連接,客戶端瀏覽器首先要向服務器發起一個HTTP請求,這個請求和通常的HTTP請求不同,包含了一些附加頭信息,其中附加頭信息“Upgrade:WebSocket”表明這是一個申請協議升級的HTTP請求,服務器端解析這些附加的頭信息然后產生應答信息返回給客戶端,客戶端和服務器端的WebSocket連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,并且這個連接會持續存在直到客戶端或者服務器端的某一方主動的關閉連接。
客戶端的HTML和JavaScript
目前大部分瀏覽器支持WebSocket()接口,你可以在以下瀏覽器中嘗試實例:Chrome,Mozilla,Opera 和 Safari 。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>WebSocket</title>
<script type="text/javascript">
function WebSocketTest() {
if ("WebSocket" in window) {
console.log("您的瀏覽器支持 WebSocket!");
// 打開一個 web socket
var ws = new WebSocket("ws://localhost:9998/echo");
ws.onopen = function() {
// Web Socket 已連接上,使用 send() 方法發送數據
ws.send("發送數據");
console.log("數據發送中...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
console.log("數據已接收...");
};
ws.onclose = function()
{
// 關閉 websocket
console.log("連接已關閉...");
};
}else{
//您的瀏覽器不支持 WebSocket
console.log("您的瀏覽器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">運行 WebSocket</a>
</div>
</body>
</html>
安裝 pywebsocket
在執行以上程序前,我們需要創建一個支持 WebSocket的服務,從pywebsocket 下載mod_pywebsocket,或者使用git命令下載:
git clone https://github.com/google/pywebsocket.git
mod_pywebsocket需要 python 環境支持
mod_pywebsocket 是一個Apache HTTP的Web Socket的擴展,安裝步驟如下:
- 解壓下載的文件;
- 進入 pywebsocket 目錄;
- 執行命令:
$ python setup.py build
$ sudo python setup.py install
- 查看文檔說明:
$ pydoc mod_pywebsocket
開啟服務
在 pywebsocket/mod_pywebsocket 目錄下執行以下命令:
$ sudo python standalone.py -p 9998 -w ../example/
以上命令會開啟一個端口號為9998的服務,使用 -w 來設置處理程序 echo_wsh.py 所在的目錄。
現在我們可以在Chrome瀏覽器打開前面創建的文件,如果你的瀏覽器支持WebSocket()。點擊“運行WebSocket”,就可以在控制臺看到整個流程各個步驟輸出的內容;
在我們停止服務后,會輸出“連接已關閉...” 。