2017-08-02 95 views
0

我無法將活動廣播到特定的房間。socket.broadcast.to未被任何客戶端收到

我檢查房間裏的客戶,他們似乎已經正確地加入了房間。

但是socket.broadcast.to(socket.roomChannel).emit("cardSelected", cardInfo) 根本就沒有工作,

socket.broadcast.emit("cardSelected", cardInfo)作品(但我只需要廣播到房間)。

這是推動我瘋了...... 這裏是我的代碼,不工作的部分是一路底部:

// Setup basic express server 
var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 

var io = require('socket.io')(server); 
var port = '4000'; 

server.listen(port, function() { 
}); 

this.rooms = []; 

let lastRoomId = 0 
let lastPlayerId = 0 

io.on('connection', function (socket) { 

    // send list of rooms at connect 
    socket.emit("connected", {rooms: this.rooms}); 
    socket.id = ++lastPlayerId; 

    // Room 
    socket.on('createRoom', (roomName) => { 
     const room = { 
      id: ++lastRoomId, 
      name: roomName, 
      players: [], 
     } 
     this.rooms.push(room); 
     socket.emit("roomCreated", room); 
     socket.broadcast.emit("update_rooms", {rooms: this.rooms}); 
    }); 

    socket.on('joinRoom', (id) => { 
     const index = this.rooms.map(room => room.id).indexOf(id); 
     if (index >= 0) { 
      this.rooms[index].players.push(socket.id); 
      socket.emit("roomJoined", this.rooms[index]); 

      socket.roomId = id; 
      socket.roomChannel = this.rooms[index].name; 

      socket.join(socket.roomChannel); 

      socket.broadcast.emit("update_rooms", {rooms: this.rooms}); 
     } 
    }); 


    // Game 
    socket.on('cardSelected', (cardInfo) => { 
     console.log("broadcasting to", socket.roomChannel); 
     console.log("socket room", socket.rooms); 

     var clients = io.sockets.adapter.rooms[socket.roomChannel].sockets; 
     // Shows that the clients ARE in the room 
     // returns "{ '1': true, '2': true }" if I have two clients 
     console.log(clients); 

     // DOESNT WORK!! 
     socket.broadcast.to(socket.roomChannel).emit("cardSelected", cardInfo) 
     // DOESNT WORK!! 
     io.to(socket.roomChannel).emit("cardSelected"); 

     // Works 
     socket.broadcast.emit("cardSelected", cardInfo); 
    }); 
}); 

我也試過socket.to(socket.roomChannel).emit("cardSelected", cardInfo);(不包括廣播),沒有任何成功

+0

您確定除了播放廣播節目之外,您還在同一個房間中有其他套接字嗎?你確定'socket.roomChannel'包含正確的值嗎? – jfriend00

+0

是的,正如我在代碼中顯示的那樣:var clients = io.sockets.adapter.rooms [socket.roomChannel] .sockets; //顯示客戶端位於房間內 //如果我有兩個客戶端,則返回「{'1':true,'2':true}」 console.log(clients); ' –

+0

你是否在調試器中逐步完成它,看看它在做什麼?這就是我會做的。 – jfriend00

回答

0

在調試了socket.io中的代碼之後,我發現改變套接字的「id」的值正在破壞一切!

我刪除了這條線socket.id = ++lastPlayerId;,現在一切工作正常:)

所以,請記住:決不手動更改插座的ID。

+0

是的,'id'值是socket.io如何跟蹤哪些套接字位於哪些房間。如果你改變了這一點,你可以打破房間。我想''{{1':true,'2':true}「'應該是你顯然將'1'和'2'分配爲id值的線索。很高興你現在有足夠的信心去調試其他代碼庫。你將能夠以這種方式解決許多未來的問題,並在這樣做時學到很多東西。 – jfriend00

+0

僅供參考,經過適當的時間後,您可以接受您自己的答案。 – jfriend00

+0

是的,我知道,但它不夠長:)感謝提醒 –