2013-10-12 2 views
3

Я пытаюсь испускают к определенному гнездо ID:Испустите к гнезду IO socket.id

socket(user[playID]).emit('correct', data); 

Но я получаю:

TypeError: object is not a function 

если выйти user[playID] я получаю действительный идентификатор сокета.

Оценка!

Вот моя настройка на случай, если я что-то упустил.

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

ответ

9

Это должно сделать это

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

This answer охватывает ту же тему/аналогичную. Короче говоря, подумайте о том, чтобы держать ссылку на подключенных клиентов самостоятельно и испускать их по желанию, вместо того, чтобы полагаться на внутренние элементы socket.io, которые могут измениться.

0

Это должно работать:

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

Нет У меня все еще такая же проблема. –

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

Надежда, что помогает немного.

0

Поскольку socket.io не предоставляет стабильный API для получения сокета из идентификатора сокета, вы можете просто (и легко) отслеживать их с помощью объекта, управляемого идентификаторами сокетов.

sockets_by_id = {} 

io.on "connection", (socket)-> 
    sockets_by_id[socket.id] = socket 

sockets_by_id[socket_id].emit event, data... 

(^ CoffeeScript ^)

2

http://socket.io/docs/rooms-and-namespaces/ Пер,

Каждое гнездо в Socket.io идентифицируется случайным, неопределяемых, уникальный идентификатор сокета # Идентификатор. Для вашего удобства каждый сокет автоматически присоединяется к комнате, указанной этим идентификатором.

Вы испускать в комнату, как:

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

Если вы хотите, чтобы излучать только определенный socket.id, просто заменить «некоторую комнату» с соответствующим идентификатором.

2

UPDATE: в socket.io-1.4 вы должны добавить «/ #» к идентификатору сокета (очень разочаровывающее, что он не работает сейчас). вы также можете просмотреть все подключенные разъемы из бэкэнда в качестве io.sockets.connected

io.to("/#" + socket_id).emit("event_name",{data:true}) 
Смежные вопросы