2016-12-17 2 views
1

Я хочу, чтобы отправить сообщение в определенную комнату (все клиенты в комнате), я искал много и пытался эти варианты:Не удается отправить сообщение в конкретную комнату [socket.io]

 io.in(socket.RoomId).emit('Test'); 
     io.to(socket.RoomId).emit('Test');   
     io.sockets.in(socket.RoomId).emit('Test'); 

Я хотел для отправки в качестве сервера, поэтому без использования существующего сокета в комнате. Но так как я не мог найти способ, которым я попытался следующие:

this.ListOfSockets[0].to(RoomId).emit('Test'); 

Это работает не так, поэтому я попытался просто испускать к самому гнезду, как это:

this.ListOfSockets[0].emit('Test'); 

И это работает, как я ожидается.

Что я делаю неправильно? Почему я не могу отправить сервер для всех клиентов в определенной комнате?

Update 2: Добавление еще немного кода для литий X

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

console.log('client connected'); 
playerCount++; 

//For testing purposes I give player random generated string using: var shortid = require('shortid'); 
socket.id = shortid.generate(); 
console.log('id of this socket is:' + socket.id); 

//When client decides to play the game and want's to join a random room 
socket.on('JoinRoom', function() 
{ 
    //Checks if there exist an open room 
    if(OpenRoom.length > 0) 
    { 
     //Joins first room in openroom list 
     socket.join(OpenRoom[0].RID); 
     socket.RoomId = OpenRoom[0].RID; 

     //Joinedroom lets player open the next scene in my game 
     socket.emit('JoinedRoom'); 

     //Joinedroom is a function that sends information to the socket about the room and the state of the game, 
     //adding the the player to room etc. 
     JoinedRoom(socket.id, OpenRoom[0].RID, socket); 
    } 
    else 
    { 
     //If there is no open room, it creates a new room with new id. 
     OpenRoom.push({ RID:shortid.generate(), TimeOutID: null }); 
     //Joins room 
     socket.join(OpenRoom[OpenRoom.length - 1].RID); 
     socket.RoomId = OpenRoom[OpenRoom.length - 1].RID; 

     //Creates room and fills information to it 
     socket.emit('JoinedRoom'); 
     var NewRoom = new Room(OpenRoom[OpenRoom.length - 1].RID) 
     NewRoom.addPlayer(socket.id); 
     NewRoom.addSocket(socket); 

     Rooms.push(NewRoom); 

     OpenRoom[OpenRoom.length - 1].TimeOutID = setTimeout(CloseRoom, 5000, OpenRoom[OpenRoom.length - 1]); 
    } 

    //Checking if RoomId exists, it exists. 
    console.log(socket.RoomId); 

    //When I send 'test' to client, the client should print 'Succesfully Tested' to the console 

    //For io.to I dont get the message 'Succesfully Tested' 
    io.to(socket.RoomId).emit('Test'); 

    //With socket.emit I get 'Succesfully Tested' message inside my console at the client side. 
    socket.emit('Test'); 

}); 

Заранее спасибо

+0

Если вы регистрируете 'OpenRoom [OpenRoom.length - 1] .RID', что происходит в каждой точке? –

+0

'socket.join (OpenRoom [OpenRoom.length - 1] .RID);' Также не должно быть 'socket.join (OpenRoom [OpenRoom [0]]. RID);' Если вы не добавляете к нему? –

+0

Да, после того, как вы упомянули об этом, я изменил его на 0. В партии я получаю на каждом этапе один и тот же идентификатор, чтобы он работал хорошо. Это может быть неправильно на стороне клиента? Это мой код на стороне клиента: socket.On («Тест», onTest); (это код C# для движка для единства) –

ответ

1

По умолчанию все розетки соединены там собственный личный номер, когда socket.id происходит, но для создания отдельных комнат вам нужно позвонить socket.join('foo'); на розетку, которую вы хотите стать частью комнаты.

Затем, после чего вы будете иметь возможность отправить сообщение, чтобы в комнате, используя io.to('foo').emit('test'); Кроме того, обратите внимание, что вы также можете добавить broadcast между io. и .to, которая позволит вам отправить сообщение всем гнездами кроме разъем, который сделал вызов.

socket.join(OpenRoom[OpenRoom.length - 1].RID); Кроме того, это должно быть socket.join(OpenRoom[OpenRoom[0]].RID);

Вы должны будете использовать socket.On('Test', data =>{ //code here}) В этом вы можете сделать вызов вашей функции onTest и передать необходимую информацию с помощью данных.

+0

Привет, спасибо за объяснение, но я уже присоединился к отдельной комнате. Это код: socket.join (OpenRoom [OpenRoom.length - 1] .RID); socket.RoomId = OpenRoom [OpenRoom.length - 1] .RID; Я добавляю идентификатор комнаты в socket.RoomId и использую RoomId для отправки сообщения в комнату, но без успеха. –

+0

Если бы вы могли отредактировать это в своем вопросе, я сделаю некоторое тестирование, как только вы добавите его в качестве кода :-) –

+0

Я добавил еще код –