什么是SockJS?
SockJS是一個提供Websocket通信的JavaScript庫,目的是實現在瀏覽器與服務器之間低延遲、全雙工、跨域通信,它提供跨瀏覽器的統一API,即使不支持HTML5 Websocket的瀏覽器也能通過SockJS實現Websocket通信,SockJS支持不同的后端腳本語音,包括NodeJS、Python、Java等,這里主要介紹SockJS-node,即支持NodeJS的版本。
SockJS-node server
SockJS-node 是瀏覽器端運行的SockJS-client庫對應的服務端,由CoffeeScript編寫。
安裝sockjs-node,首先確認你的機器已經安裝NodeJS,然后執行:
npm install sockjs
你或許有安全方面的考慮,可以安裝rbytes庫,SockJS將在rbytes可用時用到它,當然,如果不安裝rbytes或安裝失敗,也不會影響SockJS的正常使用:
npm install rbytes
下列的語句將創建一個簡單的SockJS服務端:
var http = require('http'); var sockjs = require('sockjs'); var echo = sockjs.createServer(); echo.on('connection', function(conn) { conn.on('data', function(message) { conn.write(message); }); conn.on('close', function() {}); }); var server = http.createServer(); echo.installHandlers(server, {prefix:'/echo'}); server.listen(9999, '0.0.0.0');
SockJS-node API
SockJS的API是建立在NodeJS的通用API之上,如 Steams API 和Http.Server API。
Server class
與NodeJS的http.createServer模塊類似,SockJS通過以下語句創建一個Server類:
var sockjs_server = sockjs.createServer(options);
options是一個散列數組,可以包含以下屬性:
sockjs_url (string, required)
不支持跨域通信的傳輸協議通過使用iframe技巧來實現跨域處理。瀏覽器從外部域SockJS server獲取一個簡單的頁面,然后置於一個不可見額iframe里,在這個iframe中運行的code不會有跨域的問題。
prefix (string)
response_limit (integer)
websocket (boolean)
jsessionid (boolean or function)
log (function(severity, message))
heartbeat_delay (milliseconds)
disconnect_delay (milliseconds)
Server instance
聲明SockJS Server的實例,便可與http.Server的實例耦合
var http_server = http.createServer(); sockjs_server.installHandlers(http_server, options); http_server.listen(...);
其中的option可以覆蓋創建Server實例時的option。
Server實例是一個 EventEmitter,可以執行以下事件
Event: connection (connection)
成功建立於客戶端的連接
不在prefix定義的path之下的所有http請求將不會被SockJS Server應答,並且會被轉移至之前注冊的handler處理,所以,在執行installhandlers之前,必須聲明自定義的http handler
Connection instance
connection實例支持NodeJS的Steams API,包括以下方法和屬性:
- 屬性: readable (boolean)
- 屬性: writable (boolean)
- 屬性: remoteAddress (string)
- 屬性: remotePort (number)
- 屬性: address (object)
- 屬性: headers (object)
- 屬性: url (string)
- 屬性: pathname (string)
- 屬性: prefix (string)
- 屬性: protocol (string)
- 屬性: readyState (integer)
- write(message)
- close([code], [reason])
- end()
Connection實例可執行以下事件(Events):
- 事件: data (message)
- 事件: close ()
example:
sockjs_server.on('connection', function(conn) { console.log('connection' + conn); conn.on('close', function() { console.log('close ' + conn); }); conn.on('data', function(message) { console.log('message ' + conn, message); }); });