【问题标题】:Emit to Socket IO socket.id发送到 Socket IO socket.id
【发布时间】:2013-10-20 11:10:10
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    更新:在 socket.io-1.4 中,您必须在套接字 id 前面加上“/#”(非常令人沮丧的是它现在不起作用)。您还可以从后端查看所有连接的套接字为 io.sockets.connected

    io.to( "/#" + socket_id).emit("event_name",{data:true})
    

    【讨论】:

      【解决方案2】:

      http://socket.io/docs/rooms-and-namespaces/

      Socket.IO 中的每个 Socket 都由一个随机的、不可猜测的、 唯一标识符 Socket#id。为了您的方便,每个插座 自动加入由该 id 标识的房间。

      你发射到一个房间,比如:

      io.to('some room').emit('some event')
      

      如果您只想发送到特定的 socket.id,只需将 'some room' 替换为关联的 id。

      【讨论】:

        【解决方案3】:

        由于 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^)

        【讨论】:

          【解决方案4】:

          应该这样做

          servio.sockets.socket(id).emit('hello');
          

          This answer 涵盖相同/相似的主题。简而言之,考虑自己保留对已连接客户端的引用并根据需要向它们发出,而不是依赖 socket.io 的内部结构,这可能会发生变化。

          【讨论】:

            【解决方案5】:

            另一种方法是:

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

            希望能有所帮助。

            【讨论】:

              【解决方案6】:

              这应该可行:

              servio.sockets.sockets[playId].emit(...)
              

              【讨论】:

              • 不,我仍然有同样的问题。
              猜你喜欢
              • 1970-01-01
              • 2021-03-17
              • 1970-01-01
              • 2012-02-26
              • 2017-10-23
              • 2019-08-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多