使用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); }); }); 

但客户端什么也不做。 我尝试了几乎所有的东西。 有人能告诉我我做错了什么,请! 🙁

发送一条消息到特定的客户端,保存每个连接到服务器的对象。

 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', {}); 

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

  • 正如pkyeck所说,保存所有的客户端到一个对象,所以你可以稍后发送到这些特定的客户端在你的路由处理程序,例如:

     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

请注意,这两个示例解决scheme都假定socket.io和express已被configuration为使用相同的会话存储,并因此引用相同的会话对象。 查看上面和下面的链接以获取更多详细信息:

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

2件事

1)你应该把你的io.sockets.on(..)放在app/updatepath之外,以防止为客户端添加多个监听器。

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

在socket.io 1.0中,这是如何工作的。 它可能适用于较低版本,但我不能保证它。

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

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

另外,如果你打算升级到1.0版本,那么对api有很多改变,所以你有时需要修改一些代码才能在1.0中工作。

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

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

您也可以用“users_socket_id”的房间名replace为指定的socket.io房间。

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

然后改变线

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

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

我相信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.client的另一种方法,但我没有使用该方法。

其他解决scheme: 使用socket.io和node.js将消息发送到特定的客户端

你有没有尝试过使用?

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

我厌倦了最新版本的节点和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);