[轉載]使用node.js+socket.io搭建即時訊息系統

來源:互聯網
上載者:User

標籤: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搭建即時訊息系統

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.