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

时间:2011-08-02 14:37:13

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

,客户端看起来像这样:

$(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);
    });
});

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

9 个答案:

答案 0 :(得分:53)

将消息发送到特定客户端,保存连接到Object中服务器的每个客户端。

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

io.sockets.on('connection', function (socket) {
  clients[socket.id] = socket;
});

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

var socket = clients[sId];
socket.emit('show', {});

答案 1 :(得分:18)

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

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

    var sessionsConnections = {};
    sio.on('connection', function (socket) {
      // do all the session stuff
      sessionsConnections[socket.handshake.sessionID] = socket;
    });
    
  • 或者,使用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!');
    });
    

确认:

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

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

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

答案 2 :(得分:7)

2件事

1)您应该将io.sockets.on(..)置于app/update路径之外,以防止为客户添加多个侦听器。

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

答案 3 :(得分:5)

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

socket.to(socket_id_here).emit('new', 'hello');

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

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

答案 4 :(得分:4)

在Socket.io 1.0+中执行此操作的正确方法是:

io.to(users_socket_id).emit('new', 'hello');

您也可以将房间名称替换为' users_socket_id'发射到特定的socket.io房间。

答案 5 :(得分:2)

首先,您不能在客户端使用socket.id

然后更改行

var socket = io.connect('http://localhost:80/socket.io/socket.io.js');

var socket = io.connect('http://localhost:80/');

答案 6 :(得分:0)

我相信io.sockets.socket已被删除,并且在Socket.IO(https://github.com/socketio/socket.io/issues/1618)中一直存在问题。

您可以使用io.sockets.connected [socket.id]并存储socket.id以通过用户名引用用户:

var usernames = {};
usernames[username] = socket.id;
// Sending the message
io.sockets.connected[usernames[username]].emit(...);

我没有在文档的任何地方看到它,所以我可以看到它没有得到解答。此外,如果您没有通过用户名进行任何引用,则可以尝试:

users[socket.id] = socket.id;

复制键和值以便于访问。

如下所述,使用io.clients还有另一种方法,但我还没有使用过这种方法。

其他解决方案:Send message to specific client with socket.io and node.js

答案 7 :(得分:0)

你尝试过使用过吗?

var socket = io.connect('http://localhost:80/');

答案 8 :(得分:0)

  

我厌倦了最新版本的node和socket.io   下面我将发布完整的代码

  <ul id="messages"></ul>
<form action="">
  <input id="id1"  /><button>Send</button>
</form>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>

  var io = io.connect();
  $('form').submit(function(){
    io.emit('drumevent', $('#id1').val());
    $('#id1').val('');
    return false;
  });
  io.on('drumevent', function(msg){
  console.log(msg);



    $('#messages').append($('<li></li>').text(msg.message+'    quantity = '+msg.quantity));
  });
</script>

  

服务器端代码

  var usernames = {};io.on('connection', function(socket){usernames["username"] = socket.id;
socket.on('drumevent', function(msg){     
var socketId = socket.id;io.to(socketId).emit('drumevent', data);