2013-10-12 89 views
3

我想發出一個特定的插座ID:射向插槽IO socket.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); 

回答

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來從套接字的ID中獲取套接字,因此您可以簡單地(並且容易地)使用由套接字ID鍵入的對象來跟蹤它們。

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每個插座是由一個隨機的,不可猜測, 唯一標識符插槽#id標識。爲了您的方便,每個插座 都會自動加入由此ID標識的房間。

你發出一個房間,如:

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

如果要發射只是一個特定的socket.id,只需更換「一些房間」與關聯的ID。

2

UPDATE:在socket.io-1.4中,你必須在套接字ID前加上「/#」(非常令人沮喪的是它現在不起作用)。您還可以查看所有連接的插座從後端爲io.sockets.connected

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