Nodejs只有特定的登录用户才能收到消息

时间:2016-08-14 04:02:19

标签: javascript node.js

当用户在线并且不关闭我们的客户端(如浏览器选项卡或Android应用程序)时,我可以通过

向每个特定用户发送消息
socket.broadcast.to(socketId)
    .emit('new message', {
        username: data.fromUsername,
        money   : 'Hurrraaa'
    });

当用户关闭客户端作为移动应用程序时,此事件不会触发,但我可以将任何消息发送到广播:

socket.broadcast.emit('new message', "hooooorrrrraaaaa");

我的用户不会随时使用客户端应用程序,但我需要向某个特定用户发送消息并通知用户,直到打开应用程序并查看消息,用户应该在我的应用程序中获取每个我希望从服务器发送的消息,如不需要用户的聊天信使当前正在使用WhatsApp等应用程序,我该如何解决这个问题呢?

然后问题是当某些特定用户是istalled应用程序并且记录为ti服务器时发送消息,但是现在没有使用和等待接收消息的应用程序,例如广播或特殊消息给自己

此代码是我的简化服务器:

var socket      = require('socket.io'),
    express     = require('express'),
    app         = express(),
    server      = require('http').createServer(app),
    io          = socket.listen(server),
    port        = process.env.PORT || 3000,
    mysql       = require('mysql'),
    uuid        = require('node-uuid'),
    datetime    = require('node-datetime'),
    moment      = require('moment'),
    bcrypt      = require('bcrypt'),
    async       = require('async'),
    request     = require('request'),
    redis       = require("redis"),
    redisClient = redis.createClient(),
    forever     = require('forever'),
    log         = require('log4node');

var io_redis = require('socket.io-redis');
io.adapter(io_redis({host: 'localhost', port: 6379}));

require('sticky-socket-cluster/replace-console')();

var options = {
    workers     : require('os').cpus().length,
    first_port  : 8000,
    proxy_port  : 3000,
    session_hash: function (req, res) {
        return req.connection.remoteAddress;
    },

    no_sockets: false
};

require('sticky-socket-cluster')(options, start);

function start(port) {
    io.sockets.on('connection', function (socket) {
        socket.on('new message', function (data) {
            socket.broadcast.emit('new message', "hooooorrrrraaaaa");
        });

        socket.on('login', function (data) {
            log.info(JSON.stringify(data))
            login(data.username, data.password, function (success, value) {
                if (success) {
                    redisClient.exists(data.username, function (err, doesExist) {
                        if (err) return;
                        if (!doesExist) {
                            redisClient.set(data.username, socket.id, function (err, res) {
                                redisClient.set(data.username, socket.id);
                            });
                        }
                        else {
                            redisClient.del(data.username);
                            redisClient.set(data.username, socket.id, function (err, res) {
                                redisClient.set(data.username, socket.id);
                            });
                        }
                    });
                    socket.emit('login', {
                        result                : true,
                        id                    : value.id,
                        registeredMobileNumber: value.registeredMobileNumber
                    });
                } else {
                    socket.emit('login', {result: false});
                }
            });
        });

        socket.on('userConnected', function (username) {
            redisClient.exists(username, function (err, doesExist) {
                if (err) return;
                if (!doesExist) {
                    redisClient.set(username, socket.id, function (err, res) {
                        redisClient.set(username, socket.id);
                    });
                }
                else {
                    redisClient.del(username);
                    redisClient.set(username, socket.id, function (err, res) {
                        redisClient.set(username, socket.id);
                    });
                }
            });
        });

        socket.on('disconnectUser', function (data) {
            redisClient.exists(data.username, function (err, doesExist) {
                if (err) return;
                if (doesExist) {
                    redisClient.del(data.username);
                }
            });
        });

        server.listen(port, function () {
            console.log('Express and socket.io listening on port ' + port);
        });
}

1 个答案:

答案 0 :(得分:0)

您可以使用socket.on('disconnect', function() {});

  • 当用户断开连接时,请保存用户user_id。
  • user_id上的后续消息将保存在服务器中。
  • 当客户端再次重新连接时,获取最新消息的时间,然后在该时间之后(保存在服务器中)将消息推送到客户端。