jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

Node.js 入門, #6:撰寫 WebSocket Server

.作者:jollen/
.日期:July 23, 2014 9:13 PM


本文章採用 Markdown 語法撰寫(why?),若無法閱讀內文,請點擊這裡

認識 WebSocket

WebSocket 是 HTML5 裡的一個標準,它是一種 TCP/IP 的連線技術。在協定部份,則是基於 HTTP(Over HTTP)協定。因此,WebSocket 標準定義了一些 HTTP Headers 來進行 Client/Server 的通訊。

WebSocket 分為 Client 端與 Server 端二個部份,本章要介紹的是利用 Node.js 技術,來開發 WebSocket Server。 目前有許多現成的 Node.js WebSocket 模組可使用,實作時,我們就不必自行處理複雜的 WebSocket 協定問題。

安裝 WebSocket 模組

本章所使用的 WebSocket 模組,要使用 npm 工具另外安裝。利用 npm 安裝 WebSocket-Node:

 $ npm install websocket

WebSocket-Node 原始碼可由 Github 上取得:

https://github.com/Worlize/WebSocket-Node

安裝,依據需要,可引入不同的模組。WebSocket-Node 提供 4 個模組如下:

  • var WebSocketServer = require('websocket').server;
  • var WebSocketClient = require('websocket').client;
  • var WebSocketFrame = require('websocket').frame;
  • var WebSocketRouter = require('websocket').router;

NoChat 範例,將會使用 'server' 模組。

建立 WebSocket Server

基於先前的範例,繼續修改 server.js 的程式碼如下:

// 06-websocket-with-protocol/server.js
 1 var http = require("http");
 2 var url = require("url");
 3 var WebSocketServer = require('websocket').server;
 4 
 5 function start(route, handlers) {
 6   function onRequest(request, response) {
 7     var pathname = url.parse(request.url).pathname;
 8     var query = url.parse(request.url).query;
 9 
10     console.log("Request for " + pathname + " received.");
11 
12     route(pathname, handlers, response, query);
13 
14     response.writeHead(200, {"Content-Type": "text/plain"});
15     response.write("Hello World");
16     response.end();
17   }
18 
19   var server = http.createServer(onRequest).listen(8080, function() {
20      console.log("Server has started and is listening on port 8080.");
21   });
22 
23   wsServer = new WebSocketServer({
24     httpServer: server,
25     autoAcceptConnections: false
26   });
27 
28   function onWsConnMessage(message) {
29     if (message.type == 'utf8') {
30       console.log('Received message: ' + message.utf8Data);
31     } else if (message.type == 'binary') {
32       console.log('Received binary data.');
33     }
34   }
35 
36   function onWsConnClose(reasonCode, description) {
37     console.log(' Peer disconnected with reason: ' + reasonCode);
38   }
39 
40   function onWsRequest(request) {
41     var connection = request.accept('echo-protocol', request.origin);
42     console.log("WebSocket connection accepted.");
43 
44     connection.on('message', onWsConnMessage);
45     connection.on('close', onWsConnClose);
46   }
47 
48   wsServer.on('request', onWsRequest);
49 }
50 
51 // Export functions
52 exports.start = start;

先將 WebSocket-Node 的 'server' 匯入,如程式碼第3行。其它的修改細節條列如下:

  • 第 19~26 行:將原本的 HTTP Server 物件,聚合至(傳遞)WebSocket Server。WebSocker Server 的物件名稱為 wsServer
  • 第 48 行:在 wsServer 物件裡註冊一個 Request Handler,即 onWsRequest() 函數
  • 第 40 行:當 WebSocket 的連線請求發生時,便回呼此函數
  • 第 41 行:接受該 WebSocket 連線,第一個參數是 WebSocket Protocol,這是一個自定的協定名稱,用途由開發者定義
  • 第 44~45 行:為此連線註冊 Message Handler 與 Close Handler 函數
  • 第 28 行:收到用戶端傳送過來的訊息時,回呼此函數,後續將繼續擴充此函數,將收到的訊息儲存,並將訊息即時(Real-time)推送(Push)到所有的用戶端
  • 第 36 行:該 WebSocket 連線關閉後,回呼此函數

學會建立 WebSocket Server 後,就可以開始建立與 Client 端的連線了。

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2014 www.jollen.org. All rights reserved.
Last update: 2026-07-22