WebSocket必須要有伺服器端的支援才能運作,所以來看看Node.js最多人使用的Socket.IO怎麼使用。
Socket.IO是Node.js上最早的WebSocket伺服器,不過目前也有好幾個其他的方案,那麼為什麼他會這麼受歡迎?
個人的看法是他承繼了Node.js的事件處理方法,把Client端與Server端的程式統一成一至的操作方式,讓使用者可以只需專注在處理「事件」,就可以快速開發出應用。另外,他也提供了很好的fallback機制,即使用戶的瀏覽器不支援WebSocket,他還是可以利用Flash、XMLHttpRequest等方式來傳送資訊(速度會比較慢就是了)。這些機制都他都包裝好了,所以寫程式時並不需要知道這些細節,只需要設定好就可以運作。這對於使用者來說是一大福音...
那麼就先來看一下怎麼使用Socket.IO。(安裝我就不多介紹,為了提昇效率,Socket.IO有使用原生的模組,所以建議在Linux上要安裝GCC、Mac上要安裝XCode、Windows上至少要安裝VisualStudio 2010 Express版本的Visual C++)
Socket.IO會提供一套Javascript Library給瀏覽器使用,透過這套Library,就可以使用跟Node.js的EventEmitter的方式來使用WebSocket。簡單地說,大部分的操作就是:
不過與使用瀏覽器中的事件不同,在瀏覽器中呼叫emit時,會觸發伺服器上定義好的事件,而在伺服器端呼叫emit時,則觸發瀏覽器端的事件。(這是一個在Socket.IO包裝好後抽象出來的概念,所以不要跟DOM的事件觸發搞混了。對瀏覽器來說,事件的定義觸發實際上是透過WebSocket傳送的參數與程式產生的Javascript Library實作出來的)
接下來就寫一個最簡單的echo程式來測試Socket.IO基本寫法。
首先是Client的網頁:
<html en='utf8'>
<style>
div {
font-size: 12px;
border-radius: 10px;
border: solid 1px #336699;
padding: 15px 15px 15px 15px;
line-height: 20px;
width: 400px;
}
</style>
<script src='/socket.io/socket.io.js'></script>
<script src='http://code.jquery.com/jquery-1.8.2.min.js'></script>
<script>
$(document).ready(function() {
var socket = io.connect('http://localhost/');
// 2
socket.on('echoback', function(m) {
$('#panel').html($('#panel').html()+'<br>'+m);
});
// 1
$('#send').click(function() {
socket.emit('echopost', 'Hello Socket.IO');
});
});
</script>
<button id='send'>send</button>
<div id='panel'></div>
首先透過io.connect()連線到伺服器,回傳socket物件來進行後續操作。接下來就做兩件事:
再來看伺服器:
var fs = require('fs');
// 1
var app = require('http').createServer(function(req, res) {
fs.readFile('test829.html', function(err, data) {
if(err) {
res.writeHead(500);
return res.end('Error reading default index.');
} else {
res.writeHead(200);
res.end(data);
}
});
});
// 2
var io = require('socket.io').listen(app);
io.sockets.on('connection', function(socket) {
// 3
socket.on('echopost', function(data) {
// 4
var date = new Date();
socket.emit('echoback', '['+date+'] '+data);
});
});
app.listen(80);
這個伺服器程式:
可以看到,除了使用http伺服器來傳送網頁,以及把Socket.IO掛上http伺服器的程式外,只要依靠on跟emit就可以完成大部分的事情,而且這個使用方式跟瀏覽器端差不多,這就是Socket.IO便利的地方。
先執行伺服器,使用(假設伺服器程式檔名是test829.js)
[root@localhost html]# node test829.js
指令來執行後,透過瀏覽器開啟localhost,就可以看到(按下幾次send按鈕後):
明天再來看看,怎樣用Socket.IO來寫一個chat應用。