原文http://fallenlord.blogbus.com/logs/110768932.html
方案
要實現一個WebSocket有很多方案,用戶端方面可以用原生的WebSocket對象,也可以使用類似Socket.IO、jQuery Websocket Plugin這樣的封裝API,伺服器端則可以使用Jetty(Java)、Netty(Java)、mod_pywebsocket(Python&Apache)、nodejs(JavaScript)等
這裡我挑選了用戶端Socket.IO+伺服器端Socket.IO-node,這樣做一方面用戶端和伺服器端都使用JavaScript,避免有些童鞋因為不瞭解Java、Python等其他語言而導致學習成本增加,另一方面兩端架構均使用Socket.IO也可以避免用戶端和伺服器端學習兩套不同架構而導致的學習成本
前提條件
* Linux系統一個(或Mac、Solaris、Cgwin、MingW),用於安裝nodejs
* 支援HTML5瀏覽器一個(非IE及其核心瀏覽器均可,建議Chrome)
安裝WebSocket伺服器
1. 安裝nodejs
node.js是近年來較為流行的伺服器端JavaScript架構,基於V8引擎開發,本人曾在早期做過其中文文檔項目 https://github.com/fallenlord/node_doc_zh_CN
訪問nodejs首頁下載最新版本的nodejs,我用的是0.4.3(安裝過程以Linux為例,其他平台可以訪問https://github.com/joyent/node/wiki/Installation查看安裝方法)。然後解壓到本地
$ tar xfz node-v0.4.3.tar.gz
$ cd node-v0.4.3
$ ./configure --prefix /home/guolin/tools/node-v0.4.3
$ make
$ make install
如果安裝過程出現問題,請確認本地安裝有Python 2.4或更高版本,以及libssl-dev包
2. 安裝nodejs管理工具NPM
NPM是個nodejs外掛程式管理工具,執行下面的語句就能安裝NPM
$ curl http://npmjs.org/install.sh | sh
3. 安裝Socket.IO的nodejs外掛程式
Socket.IO是個JavaScript架構,包括伺服器端和用戶端,使用統一的API封裝了各種即時串連(如WebSocket、Flash Socket、AJAX長輪詢等),使得後端的串連可以對開發人員透明。安裝只需要執行下面的命令即可:
$ npm install socket.io
開始編碼
伺服器端代碼
在伺服器上任意目錄編輯檔案server.js:
var http = require("http"),
io = require("socket.io");
// Create HTTP server
var server = http.createServer(function(request, response) {
response.writeHead({ "Content-Type": "text/html" });
response.end("HTML5 WebSocket Demo");
});
server.listen(8000, "localhost");
// Wrap HTTP server by socket.io
var socket = io.listen(server);
socket.on("connection", function(client) {
console.log("connected");
client.on("message", function(data) {
client.send("Hello " + data);
});
client.on("disconnect", function() {
console.log("disconnected");
});
});
然後執行:
/home/guolin/tools/node-v0.4.3/bin/node server.js
可以看見伺服器開始運行,此時訪問 http://localhost:8000 如果看見HTML5 WebSocket Demo字樣表示伺服器啟動成功
注意高亮部分,訪問地址必須完全符合高亮處寫入的地址,例如,如果高亮處寫的是localhost,且伺服器IP地址為192.168.1.2,那麼訪問localhost將會成功,但訪問192.168.1.2將會失敗
用戶端代碼
在用戶端編輯client.html檔案:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" charset="utf-8" src="http://localhost:8000/socket.io/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
var socket = new io.Socket("localhost", { port: 8000 });
socket.connect();
socket.on("connect", function(){
console.log("connected");
});
socket.on("message", function(data){
console.log("received message: " + data);
document.getElementById("message").innerHTML = data;
});
socket.on("disconnect", function(){
console.log("disconnected");
})
function send() {
var name = document.querySelector("input[name=name]").value;
console.log("send message: " + name);
socket.send(name);
}
</script>
</head>
<body>
<label for="name">What's your name:</label>
<input type="text" id="name" name="name" />
<button onclick="send()">Send</button>
<div id="message" style="color: red"></div>
</body>
</html>
完成後直接用瀏覽器訪問此檔案(可以從檔案系統訪問,不要嘗試訪問 http://localhost:8000/client.html,那總是會顯示HTML5 WebSocket Demo字樣,因為nodejs內建的HTTP伺服器預設不會讀取本地檔案)
輸入你的名字如guolin,點擊Send,伺服器端將返回Hello guolin並顯示在頁面上
整個過程可以通過開啟瀏覽器Console以及觀察伺服器Console瞭解到互動過程。同時對於Chrome來說,可以從開發人員工具中的Network欄中清楚的看到WebSocket與伺服器端通訊過程(如向ws:/協議發送GET請求,並得到一個101 WebSocket Protocol Handshake的響應等)