2017-08-02 9 views
0

イベントを特定の部屋にブロードキャストすることはできません。room.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; //クライアントが2人いる場合、クライアントが部屋にいることを示します // "{'1':true、 '2':true}」 console.log(clients); ' –

+0

デバッガでこれを実行し、それが何をしているのかを確認しましたか?それは私がやることです。 – jfriend00

答えて

0

socket.ioのコードをデバッグした後、ソケットの "id"の値を変更するとすべてが壊れていたことがわかりました。

私はこのライン socket.id = ++lastPlayerId;を削除し、今ではすべてが正常に動作します:)

だから、覚えている: は手動でソケットのIDを変更することはありません。

+0

ちょっと、 'id'値はsocket.ioがどのソケットが入っているかを記録する方法ですどの部屋。それを変更すると、部屋を壊すことができます。私はあなたが明らかにid値として '1'と' 2'を割り当てていたので、 '' {'1':true、 '2':true} ''が手がかりだったはずです。これで、他のコードライブラリへのデバッグに十分に自信を持ってうれしく思います。あなたはこのように将来の多くの問題を解決し、それを行う際に多くを学ぶことができます。 – jfriend00

+0

参考までに、適切な時間が経過したら、あなた自身の回答を受け入れることができます。 – jfriend00

+0

はい、私は知っていますが、それは十分に長いされていません:)リマインダーありがとう –

関連する問題