发送到单个客户端套接字io 1.3.2

时间:2015-02-09 05:27:00

标签: node.js sockets socket.io

我在这里看了几个答案,但我认为他们指的是旧版本的socket.io,因为他们的解决方案对我没用。我正在使用

将数据恢复到浏览器中
io.emit('update', data)

但是它向所有客户端发出,所以当我转到同一个URL时,相同的数据会出现在多个窗口中。我是否必须在连接时将客户端ID存储在某处?或者我可以在发出之前将其恢复?请具体说明。我从SO尝试了一些其他的解决方案,但我得到了很多ReferenceError'id'没有定义或套接字而不是套接字。

服务器设置和连接:

var app = express();
var server = require('http').createServer(app)
var io = require('socket.io')(server)

app.get('/aPath', function (req, res, next) {
        res.writeHead(200)

    var data = {
        "val1":  req.query.val1,
        "val2":  req.query.val2,
        "val3":  req.query.val3,
        "val4":  req.query.val4,
        "val5":  req.query.val5,
        "val6":  req.query.val6,
    }

    /*console.log(io.sockets.id)*/

    //io.to(io.sockets.id).emit('update', data)
    //io.sockets.socket(id).emit('update', data)
    io.emit('update', data)
    res.end("OK")
})

io.on('connection', function (socket) {
    console.log('websocket user connected')
});

1 个答案:

答案 0 :(得分:3)

由于第三方客户端通过restful接口发送信息,因此您需要以头或查询字符串的形式在该请求中包含客户端的引用数据。

我建议使用Redis存储活动套接字用户以便快速参考。这将允许您在部署中使用多个应用程序,这些应用程序使用单个redis实例来保持数据同步。您也可以在应用程序内存中执行相同操作,但这不能很好地扩展。

首先,您需要使用中间件来验证用户并缓存socket.id

var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var redis = require('redis');

io.use(function(socket, next){
  // validate user
  // cache user with socket.id
  var userId = validatedUser;
  socket.handshake.userId = userId;
  redis.set(userId, socket.id, function (err, res) {
       next()
  });
});

接下来处理所有套接字通信

io.on('connection', function (socket) {
    console.log('websocket user connected');

    //next handle all socket communication
    socket.on('endpoint', function (payload) {
        //do stuff
        socket.emit('endpoint.response', {/*data*/});
    });

    //Then remove socket.id from cache
    socket.on('disconnect', function (payload) {
        //remove user.id from cache
        redis.del(socket.handshake.userId, function (err, res) {
             console.log('user with %s disconnected', socket.id);
        });
    });
});

处理第三方活动。

app.get('/aPath', function (req, res, next) {
    // get user from third party
    var userId = req.query.userId

    var data = {
        "val1":  req.query.val1,
        "val2":  req.query.val2,
        "val3":  req.query.val3,
        "val4":  req.query.val4,
        "val5":  req.query.val5,
        "val6":  req.query.val6,
    };

    // get cached socketId from userId
    redis.get(userId, function (err, socketId) {
        // return ok to third party;
        res.status(200).send("OK");
        only emit if socketid still exists
        if (err || !socketId) return;
        // now emit to user
        io.to(socketId).emit('update', data):
    });
});