我正在尝试发出特定的套接字ID:
socket(user[playID]).emit('correct', data);
但我得到了:
TypeError: object is not a function
如果我退出user[playID]
,我会获得有效的套接字ID。
赞赏!
这是我的设置,以防我遗漏的东西:
// Tell Socket.io to pay attention
servio = io.listen(server);
// Tell HTTP Server to begin listening for connections on port 3250
sock = server.listen(3250);
答案 0 :(得分:11)
这应该这样做
servio.sockets.socket(id).emit('hello');
This answer涵盖相同/相似的主题。简而言之,考虑自己保留对连接客户端的引用并根据需要向它们发出,而不是依赖于socket.io的内部结构,这可能会改变。
答案 1 :(得分:2)
另一种方法是:
var players = [];
io.sockets.on('connection', function(socket){
socket.on('skt_init', function (data) {
var player = new Object();
player.id = data.id;
player.socket = socket.id;
players.push(player);
});
socket.on('disconnect', function() {
var len = 0;
for(var i=0, len=players.length; i<len; ++i ) {
var p = players[i];
if(p.socket == socket.id){
players.splice(i,1);
break;
}
}
});
socket.on('skt_event', function(data, id_player){
var len = 0;
for(var i=0, len=players.length; i<len; ++i ) {
var p = players[i];
if(p.id == id_player){
io.sockets.socket(p.socket).emit('correct', data);
break;
}
}
});
希望有所帮助。
答案 2 :(得分:2)
每http://socket.io/docs/rooms-and-namespaces/,
Socket.IO中的每个Socket都是由一个随机的,不可思议的, 唯一标识符Socket#id。为了您的方便,每个插座 自动加入由此ID标识的房间。
你发射到像这样的房间:
io.to('some room').emit('some event')
如果你想只发射一个特定的socket.id,只需用相关的id替换'some room'。
答案 3 :(得分:2)
更新:在socket.io-1.4中你必须在套接字ID之前添加“/#”(非常令人沮丧的是它现在不起作用)。您还可以从后端查看所有连接的套接字,如io.sockets.connected
io.to( "/#" + socket_id).emit("event_name",{data:true})
答案 4 :(得分:0)
这应该有效:
servio.sockets.sockets[playId].emit(...)
答案 5 :(得分:0)
由于socket.io没有提供稳定的API来从套接字ID中获取套接字,因此您可以简单地(并且轻松地)使用由套接字ID键入的对象来跟踪它们。
sockets_by_id = {}
io.on "connection", (socket)->
sockets_by_id[socket.id] = socket
sockets_by_id[socket_id].emit event, data...
(^的CoffeeScript ^)