[英]Emit to Socket IO socket.id
我試圖發出一個特定的套接字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);
這應該做到這一點
servio.sockets.socket(id).emit('hello');
這個答案涵蓋相同/相似的主題。 簡而言之,考慮自己保持對連接客戶端的引用並根據需要向它們發出,而不是依賴於socket.io的內部,這可能會改變。
另一種方法是:
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;
}
}
});
希望有所幫助。
根據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'即可。
更新:在socket.io-1.4中你必須在套接字ID之前添加“/#”(非常令人沮喪的是它現在不起作用)。 您還可以從后端查看所有連接的套接字io.sockets.connected
io.to( "/#" + socket_id).emit("event_name",{data:true})
這應該工作:
servio.sockets.sockets[playId].emit(...)
由於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 ^)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.