使用socket.io和空消息队列将消息发送到特定客户端

Val*_*i K 36 node.js express socket.io

我对socket.io感到很疯狂!文档很糟糕,根本不是真的.

我想通过socket.io向特定客户端发送反馈

我的服务器端看起来像这样:

app.get('/upload', requiresLogin, function(request, response) {
    response.render('upload/index.jade');
    io.sockets.on('connection', function (socket) {
        console.log('SOCKET ID ' + socket.id);
        io.sockets.socket(socket.id).emit('new', 'hello');
    });
});
Run Code Online (Sandbox Code Playgroud)

而客户端看起来像这样:

$(document).ready(function() {
    var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
    socket.on('new', function (data) { 
        console.log(socket.id);
        console.log(data); 
        //$('#state').html(data.status);
    });
});
Run Code Online (Sandbox Code Playgroud)

但客户端什么都不做.我几乎尝试了一切.请有人告诉我我做错了什么!:(

pky*_*eck 52

向特定客户端发送消息,保存连接到对象中服务器的每个客户端.

var socketio = require('socket.io');
var clients = {};
var io = socketio.listen(app);

io.sockets.on('connection', function (socket) {
  clients[socket.id] = socket;
});
Run Code Online (Sandbox Code Playgroud)

然后你可以稍后做这样的事情:

var socket = clients[sId];
socket.emit('show', {});
Run Code Online (Sandbox Code Playgroud)


Tom*_*ers 18

通过socket.io向特定客户端发送反馈的几种方法包括:

  • 如pkyeck所述,将所有客户端保存到Object,以便稍后可以在路由处理程序中发送给这些特定客户端,例如:

    var sessionsConnections = {};
    sio.on('connection', function (socket) {
      // do all the session stuff
      sessionsConnections[socket.handshake.sessionID] = socket;
    });
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者,使用socket.io内置的房间支持 - 在连接时订阅每个客户端到一个房间,并通过这个房间在路由处理程序中发送,例如:

    sio.on('connection', function (socket) {
      // do all the session stuff
      socket.join(socket.handshake.sessionID);
      // socket.io will leave the room upon disconnect
    });
    
    app.get('/', function (req, res) {
      sio.sockets.in(req.sessionID).send('Man, good to see you back!');
    });
    
    Run Code Online (Sandbox Code Playgroud)

鸣谢:

http://www.danielbaulig.de/socket-ioexpress/#comment-1158

请注意,这两个示例解决方案都假定socket.io和express已配置为使用相同的会话存储,因此引用相同的会话对象.有关实现此目的的更多详细信息,请参阅上面和下面的链接

https://github.com/LearnBoost/socket.io/wiki/Authorizing

  • 看起来像socket.io 1.0内置支持每插槽的房间方法:http://socket.io/docs/rooms-and-namespaces/ (2认同)

3rd*_*den 7

2件事

1)你应该把你io.sockets.on(..)app/update路线放在你的路线之外,以防止为客户增加多个听众.

2)io.sockets.socket(id); 不应该使用,应该是socket.emit('new', 'hello')


Fer*_*265 5

在socket.io 1.0中,这是它的工作方式.它可能适用于较低版本,但我无法保证.

socket.to(socket_id_here).emit('new', 'hello');
Run Code Online (Sandbox Code Playgroud)

这是因为socket.io会自动将套接字添加到连接时套接字ID的房间.

此外,如果您计划升级到1.0版,那么api会有很多更改,因此您有时需要更改一些代码才能使其在1.0中运行.