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

我已经在这里看了几个答案,但我认为他们指的是旧版本的socket.io,因为他们的解决scheme没有为我工作。 我正在浏览器中获取数据

io.emit('update', data) 

但它发射给所有的客户,所以当我去到相同的URL时,相同的数据显示在多个窗口中。 是否需要在连接时将客户端ID存储在某个地方,还是可以在排放之前将其还原? 请具体说明。 我尝试了几个其他的解决scheme,但我得到了很多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') }); 

由于第三方客户端通过一个宁静的接口发送信息,因此您需要以标题或查询string的forms在该请求中包含客户端的引用数据。

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

首先,您需要使用中间件来validation用户并cachingsocket.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() }); }); 

接下来处理所有的socket通信

 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): }); });