使用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为使用相同的会话存储,并因此引用相同的会话对象。 查看上面和下面的链接以获取更多详细信息:
2件事
1)你应该把你的io.sockets.on(..)
放在app/update
path之外,以防止为客户端添加多个监听器。
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);