zoukankan      html  css  js  c++  java
  • [转载]使用node.js+socket.io搭建实时消息系统

     

    在开发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。实际业务上使用时,可以加上登陆认证,日志模块等功能,完善消息推送服务。

  • 相关阅读:
    20080408 VS2003 中 Jscript 文件中文乱码问题
    20080330 single process memory on Windows and Windows virtual memory
    20080331 Corillian's product is a Component Container Name at least 3 component containers that ship now with the Windows Server Family
    20080330 the difference between an EXE and a DLL
    20080408 Javascript中的字符串替换replaceG
    20080501 修复Windows Update 自动更新
    20080331 How many processes can listen on a single TCPIP port
    20080329 What is a Windows Service and how does its lifecycle differ from a standard EXE
    20080407 Fire in the hole
    20080328 Adobe Launches Webbased Photoshop Express
  • 原文地址:https://www.cnblogs.com/sherlock99/p/4044242.html
Copyright © 2011-2022 走看看