发送到套接字IO socket.id

时间:2013-10-12 11:57:39

标签: javascript node.js sockets socket.io

我正在尝试发出特定的套接字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);

6 个答案:

答案 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 ^)