1、web socket事件和方法 python
有了HTTP協議爲何還須要Websocket這種協議呢?由於HTTP協議發起的通訊只能經過客戶端發起,而後服務端才能夠將消息迴應到客戶端。所以HTTP協議作不到服務器主動向客戶端推送信息。git
Websocket是在單個TCP鏈接上進行全雙工通訊的協議,容許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只須要完成一次握手,二者之間就直接能夠建立持久性的鏈接,並進行雙向數據傳輸。github
實際生產環境中實現推送技術所運用的大多都是Ajax輪詢。輪詢是在特定的的時間間隔,由瀏覽器對服務器發出HTTP請求,而後由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器須要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費不少的帶寬等資源。web
簡單示例:瀏覽器
1 var ws = new WebSocket("wss://echo.websocket.org"); 2 3 ws.onopen = function(evt) { 4 console.log("Connection open ..."); 5 ws.send("Hello WebSockets!"); 6 }; 7 8 ws.onmessage = function(evt) { 9 console.log( "Received Message: " + evt.data); 10 ws.close(); 11 }; 12 13 ws.onclose = function(evt) { 14 console.log("Connection closed."); 15 };
大概執行步驟服務器
1. 構造函數websocket
WebSocket 對象做爲一個構造函數,用於新建 WebSocket 實例。app
var ws = new WebSocket('ws://localhost:8080');
執行上邊語句後,客戶端會與服務器進行鏈接。socket
2. Websocket.readstate函數
此屬性返回的是實例對象的當前狀態
1 CONNECTING : 值爲0,表示正在鏈接 2 OPEN :值爲1 ,表示鏈接成功,能夠進行通訊 3 CLOSING: 值爲2,表示鏈接正在關閉. 4 CLOSED: 值爲3 ,表示鏈接已經關閉,或者打開鏈接失敗
Java示例:
1 switch (ws.readyState) { 2 case WebSocket.CONNECTING: 3 // do something 4 break; 5 case WebSocket.OPEN: 6 // do something 7 break; 8 case WebSocket.CLOSING: 9 // do something 10 break; 11 case WebSocket.CLOSED: 12 // do something 13 break; 14 default: 15 // this never happens 16 break; 17 }
3. webSocket.onopen(事件)
實例對象的onopen
屬性,用於指定鏈接成功後的回調函數。
1 ws.onopen = function () { 2 ws.send('Hello Server!'); 3 }
若是要指定多個回調函數,可使用addEventListener
方法。
1 ws.addEventListener('open', function (event) { 2 ws.send('Hello Server!'); 3 });
4. webSocket.onclose(事件)
實例對象的onclose
屬性,用於指定鏈接關閉後的回調函數。
1 ws.onclose = function(event) { 2 var code = event.code; 3 var reason = event.reason; 4 var wasClean = event.wasClean; 5 // handle close event 6 }; 7 8 ws.addEventListener("close", function(event) { 9 var code = event.code; 10 var reason = event.reason; 11 var wasClean = event.wasClean; 12 // handle close event 13 });
5. webSocket.onmessage(事件)
實例對象的onmessage
屬性,用於指定收到服務器數據後的回調函數。
1 ws.onmessage = function(event) { 2 var data = event.data; 3 // 處理數據 4 }; 5 6 ws.addEventListener("message", function(event) { 7 var data = event.data; 8 // 處理數據 9 });
6. websocket.send(方法)
實例對象的send()方法用於向服務器發送數據
ws.send('your message');
7. webSocket.bufferedAmount
實例對象的bufferedAmount
屬性,表示還有多少字節的二進制數據沒有發送出去。它能夠用來判斷髮送是否結束。
1 var data = new ArrayBuffer(10000000); 2 socket.send(data); 3 4 if (socket.bufferedAmount === 0) { 5 // 發送完畢 6 } else { 7 // 發送還沒結束 8 }
8. websocket.onerror(事件)
實例對象的onerror
屬性,用於指定報錯時的回調函數。
1 socket.onerror = function(event) { 2 // handle error event 3 }; 4 5 socket.addEventListener("error", function(event) { 6 // handle error event 7 });
2、Websocketed服務器
它的最大特色,就是後臺腳本不限語言,標準輸入(stdin)就是 WebSocket 的輸入,標準輸出(stdout)就是 WebSocket 的輸出。
舉例來講,下面是一個python腳本counter.py
1 print('1') 2 sleep 1 3 4 print('2') 5 sleep 1 6 7 print('3')
命令行下運行這個腳本,會輸出一、二、3,每一個值之間間隔1秒。
1 2 3
如今,啓動websocketd
,指定這個腳本做爲服務。
$ websocketd --port=8080 python ./counter.py
上面的命令會啓動一個 WebSocket 服務器,端口是8080
。每當客戶端鏈接這個服務器,就會執行counter.py
腳本,並將它的輸出推送給客戶端
1 var ws = new WebSocket('ws://localhost:8080/'); 2 3 ws.onmessage = function(event) { 4 console.log(event.data); 5 };
上面是客戶端的 JavaScript 代碼,運行以後會在控制檯依次輸出一、二、3。
有了它,就能夠很方便地將命令行的輸出,發給瀏覽器。
$ websocketd --port=8080 ls
上面的命令會執行ls
命令,從而將當前目錄的內容,發給瀏覽器。使用這種方式實時監控服務器,簡直是垂手可得(代碼)。