我对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);
});
});
但客户端什么都不做。我几乎尝试了一切。请有人告诉我我做错了什么! :(
答案 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已配置为使用相同的会话存储,因此引用相同的会话对象。有关实现此目的的更多详细信息,请参阅上面和下面的链接:
答案 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);