標籤:http io os ar 使用 sp div on art
在開發web應用時,經常會有訊息接收需求。例如幕後處理完某個任務,需要告知使用者等。一個簡單的做法,是使用ajax輪詢。這樣帶來的問題一是低效,二是訊息觸達不夠即時。另一個方法是使用websocket來接收訊息,但可惜IE不支援這種方式。下面推薦一種既能即時接收訊息,又能相容各種瀏覽器的方案,那就是node.js+socket.io。
node.js的非同步非阻塞模型,做訊息推送非常合適。socket.io則負責屏蔽瀏覽器的差異,其會選擇性的使用下列方式建立串連:websocket, flash socket, ajax long polling, jsonp polling...總之,開發人員不必再考慮瀏覽器的相容問題了。
代碼編寫方面,也比較簡單,基本上只要對相應的事件,編寫代碼即可。
web頁面:
<script src="http://10.1.164.103:8080/socket.io/socket.io.js"></script>
<script>
var socket = io.connect(‘10.1.164.103:8080‘);
socket.emit(‘join‘, {
//發送使用者名稱
username: ‘test‘,
});
//監聽訊息
socket.on(‘message‘, function (data) {
//收到訊息後作業務處理
...
});
</script>
伺服器端,這裡實現接收php發來的http請求,然後將訊息推給瀏覽器的功能。注意一個使用者可能開啟多個視窗,因此這裡需要把同一個使用者建立的連結,放入同一個房間,當需要推送訊息時,把訊息在房間內廣播即可。
var host = 10.1.164.103;
var port = 8080;
var http = require(‘http‘);
var express = require(‘express‘);
var app = express();
var server = http.createServer(app);
//監聽連接埠
server.listen(port, host);
console.log(‘Server running at http://‘ + host + ‘:‘ + port + ‘/‘);
app.get(‘/‘, function(req, res){
if(req.query.name != undefined && req.query.msg != undefined){
//這裡將訊息在房間內進行廣播(對應一個使用者開啟多個視窗的情況)
io.sockets.in(req.query.name).emit(‘message‘, {code: 0, data : req.query.msg});
}
res.end();
});
var io = require(‘socket.io‘).listen(server);
var connectionList = {};
//監聽所有到伺服器上的串連.
io.sockets.on(‘connection‘, function (socket) {
connectionList[socket.id] = {socket: socket};
socket.on(‘join‘, function(data){
if(data.username != undefined){
//加入以使用者名稱命名的房間(對應一個使用者開啟多個視窗的情況)
socket.join(data.username);
connectionList[socket.id].username = data.username;
}
});
//監聽中斷連線
socket.on(‘disconnect‘,function(){
if(connectionList[socket.id].username != undefined){
//離開房間
socket.leave(connectionList[socket.id].username);
}
delete connectionList[socket.id];
});
});
//監聽中斷訊號,實現一些特殊功能
process.on(‘SIGHUP‘, function(){
....
});
至此,我們就實現了一個簡單的訊息推送demo。實際業務上使用時,可以加上登陸認證,日誌模組等功能,完善訊息推送服務。
[轉載]使用node.js+socket.io搭建即時訊息系統