Невозможно выполнить излучение в определенную комнату и клиента (Socket.io 2.0.2)

1

Я использую Socket.io для создания многопользовательской игры. Я использовал сгенерированный числовой код для динамического создания и объединения комнат.

Моя проблема связана с испусканием определенных помещений или даже конкретных клиентов. Я не могу io.in(room).emit('event') в комнату (io.in(room).emit('event') или io.to(room).emit('event') Это синонимы). Тем не менее, я могу использовать socket.emit('event') между сервером и клиентом. Нет ошибок. Просто ничего не происходит, когда я использую ничего, кроме socket.emit(), io.emit() и socket.on('',function(){ this.emit(); }).

Причина, по которой я должен исходить в конкретных комнатах, - это обновить всех клиентов в своих комнатах, когда к ним присоединился новый клиент. (Я пробовал испускать каждый socket.id в каждой комнате, но это не работает).

Выпущенные события

Я загрузил весь код, который я использовал на моем сервере Node.js, в надежде, что кто-то увидит ошибку в моей программе. Я новичок в Socket.io, и я не уверен, насколько я настроил свои динамические комнаты.

Событие комнаты, которое не работает: connectToRoom

сервер

 var express = require('express');
 var app = express();
 var http = require('http').Server(app);
 var io = require('socket.io')(http);

 app.get('/',function(req, res) {
     res.sendFile(__dirname + '/client/index.html');
 });
 app.use('/client',express.static(__dirname + '/client'));
 http.listen(3000, function(){
     console.log('listening on localhost:3000');
 });

io.on('connection', function(socket){
    socket.id = Math.random();
    SOCKET_LIST[socket.id]=socket;

    socket.on('create',function(){
        var thisGameId = ( Math.random() * 100000 ) | 0;
        roomNo+=1;
        roomArr[thisGameId]=thisGameId;
        this.emit('createResponse', {gameId: thisGameId, mySocketId: socket.id});
        this.join(thisGameId.toString());
    });

    socket.on('joinRoom',function(data){
        //playerJoinGame(data);
        //io.sockets.in(data.roomKey.toString()).emit('connectToRoom', "You are in room no. "+data.roomKey);
        //socket.to(data.roomKey.toString()).emit('connectToRoom', "You are in room no. "+data.roomKey);
        if( io.nsps['/'].adapter.rooms[data.roomKey]!== undefined ){
            socket.join(data.roomKey.toString());
            SOCKET_LIST[socket.id].username = data.username;
            this.emit('joinRoomResponse',{
                roomKey:data.roomKey
            });
        }
        if(io.nsps['/'].adapter.rooms[data.roomKey]=== undefined){
            this.emit('joinError',{
                message: "This room does not exist."
            });
        }
    });
    socket.on('updateRoom',function(data){
        var clients=io.sockets.adapter.rooms[data.roomKey].sockets;
        var clientsArr=Object.keys(clients);
        for (var clientId in clientsArr ) {
            io.sockets.connected[clientsArr[clientId]].emit('connectToRoom', {
                roomKey:data.roomKey,
                username:data.username
            });
        }

        io.sockets.in(data.roomKey).emit('connectToRoom', {
            roomKey:data.roomKey,
            username:data.username
        });
    });

    socket.on('disconnect',function(){
    delete SOCKET_LIST[socket.id];
    });
});

клиент

var socket = io();
var roomKey,username,mySocketId;    
var optionDiv = document.getElementById('optionDiv');
var optionDivCreate = document.getElementById('optionDiv-create');
var optionDivJoin = document.getElementById('optionDiv-join');

var prepDiv = document.getElementById('prepDiv');
var createDiv = document.getElementById('create-Div');
var lobbyDiv = document.getElementById('lobbyDiv');
var createRoomKey = document.getElementById('create-roomKey');
var createPlayers = document.getElementById('create-players');
var joinForm = document.getElementById('join-form');
var joinForm_roomKey = document.getElementById('join-roomKey');
var joinForm_username = document.getElementById('join-username');
var joinForm_submit = document.getElementById('join-form-submit');
var gameDiv = document.getElementById("gameDiv");

optionDivCreate.onclick=function(){
    socket.emit('create');
};
optionDivJoin.onclick=function(){
    optionDiv.style.display='none';
    prepDiv.style.display='inline-block';
    joinForm.style.display='inline-block';
};
socket.on('createResponse',function(data){
    roomKey = data.gameId;
    mySocketId = data.mySocketId;
    optionDiv.style.display='none';
    prepDiv.style.display='inline-block';
    createDiv.style.display='inline-block';
    createRoomKey.innerHTML = roomKey;
});

joinForm_submit.onclick= function(){

};
joinForm.onsubmit = function(e){
    e.preventDefault();
    roomKey = joinForm_roomKey.value;
    username = joinForm_username.value;
    socket.emit('joinRoom',{
        roomKey:roomKey,
        username:username
    });
    joinForm_roomKey.value='';
    joinForm_username.value='';
};
socket.on('joinRoomResponse',function(data){
    optionDiv.style.display='none';
    createDiv.style.display='none';
    prepDiv.style.display='none';
    lobbyDiv.style.display='inline-block';
    socket.emit('updateRoom',{
        roomKey:roomKey,
        username:username
    });
});
socket.on('connectToRoom',function(data){
    socket.emit('debug');
    //createPlayers.innerHTML = "<br />"+data.username;
    alert("triggered");
});
socket.on('joinError',function(data){
    alert(data.message);
});

HTML

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <title>Prototype</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div id="optionDiv" style="">
            <button id="optionDiv-create">Create Game</button><br />
            <button id="optionDiv-join">Join Game</button>
        </div>
        <div id="prepDiv" style="display:none;">
            <div id="create-Div" style="display:none;">
                Room Key:<br />
                <h1 id="create-roomKey"></h1>
                <h1 id="create-players"></h1>
            </div>
            <form id="join-form" style="display:none;">
                Username:<br />
                <input id="join-username" type="text" style="width:500px"></input><br />
                Room Key:<br />
                <input id="join-roomKey" type="text" style="width:500px"></input><br />
                <button id="join-form-submit">Join</button>
            </form>
        </div>
        <div id="lobbyDiv" style="display:none;">
            You are in room:<br />
            <h1 id="join-roomKey"></h1><br />
            Players in room:<br />
            <h1 id="join-players"></h1>
        </div>
        <div id="gameDiv" style="display:none;">
            <div id="gameDiv-canvas">
                <canvas id="ctx" width="500" height="500" style="border:1px solid #000000;">
                </canvas>
            </div>
            <div id="gameDiv-chat">
                <div id="chat-text" style="width:500px;height:100px;overflow-y:scroll">
                    <div>
                        Hello!
                    </div>
                </div>
                <form id="chat-form">
                    <input id="chat-input" type="text" style="width:500px"></input>
                </form>
            </div>
        </div>
        <!--<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.2/socket.io.js"></script>-->
        <script src="/socket.io/socket.io.js"></script>
        <script src="/client/js/client.js"></script>
    </body>
</html>
Теги:
dynamic
socket.io

2 ответа

0

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

Это связано с тем, что я использую один "игровой" экземпляр для всех комнат. Все игры в каждой комнате будут использовать одни и те же коды. Поскольку я запускаю отдельные уникальные игровые экземпляры для каждой уникальной комнаты, мне также нужно создать уникальный код для каждого соответствующего игрового экземпляра. Эта программа не создает уникальные коды для каждого соответствующего игрового экземпляра. Следовательно, это не сработает.

Я реорганизовал программу в модульной форме, чтобы заниматься деятельностью в каждой отдельной комнате.

0

Правильный синтаксис следующий:

io.to('some room').emit('some event');
  • 0
    Я пробовал это раньше. Наряду с: io.sockets.in ('комната'). Emit ('событие'); . Io.sockets.to ( 'номер') испускают ( 'событие'); Пространства имен io.of (''). Emit ('event'); io.of ( '/') испускают ( 'событие'). Я искал решения, и хотя все они говорят то же самое о границах синтаксиса, что и вы, мой клиент все равно не запускается этим событием.
  • 0
    Тогда попробуйте еще раз. И попробуйте socket.emit('connectToRoom') вместо io.sockets.connected[clientsArr[clientId]].emit('connectToRoom')
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню