04 Websocket和Websocketed

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服務器

Websocketd

它的最大特色,就是後臺腳本不限語言,標準輸入(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命令,從而將當前目錄的內容,發給瀏覽器。使用這種方式實時監控服務器,簡直是垂手可得(代碼)。

相關文章
相關標籤/搜索