मैं मल्टीप्लेयर गेम बनाने के लिए Socket.io का उपयोग कर रहा हूं। मैंने गतिशील रूप से कमरे बनाने और शामिल होने के लिए जेनरेट किए गए संख्यात्मक कोड का उपयोग किया है।

मेरा मुद्दा विशिष्ट कमरों या विशिष्ट ग्राहकों को उत्सर्जित करने के बारे में है। मैं एक कमरे में नहीं जा सकता (io.in(room).emit('event') या io.to(room).emit('event') वे पर्यायवाची हैं)। हालांकि मैं सर्वर और क्लाइंट के बीच socket.emit('event') में सक्षम हूं। त्रुटियाँ नहीं। बस कुछ भी नहीं होता है जब मैं socket.emit(), io.emit(), और socket.on('',function(){ this.emit(); }) के अलावा कुछ भी उपयोग करता हूं।

मुझे विशिष्ट कमरों में जाने का कारण यह है कि जब कोई नया ग्राहक जुड़ता है तो सभी ग्राहकों को उनके कमरे में अपडेट करना होता है। (मैंने प्रत्येक कमरे में प्रत्येक सॉकेट में उत्सर्जित करने की कोशिश की थी लेकिन यह काम नहीं करता है)

ब्राउज़र डीबगर ट्रैकिंग सर्वर द्वारा उत्सर्जित ईवेंट

मैंने अपने 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);
});

एचटीएमएल

<!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>
2
user8137803 9 जून 2017, 18:15
1
"मैं असमर्थ हूँ" का वास्तव में क्या अर्थ है? क्या आपको त्रुटियां मिल रही हैं? जब आप इसे आजमाते हैं तो क्या होता है? आपको वास्तविक समस्या का वर्णन करने की आवश्यकता है।
 – 
Chris G
9 जून 2017, 18:26
त्रुटियाँ नहीं। बस कुछ भी नहीं होता है जब मैं कुछ भी उपयोग करता हूं लेकिन socket.emit ();, io.emit ();, और this.emit (); जब सॉकेट.ऑन ('', फंक्शन() {}) में नेस्ट किया जाता है।
 – 
user8137803
9 जून 2017, 21:13

2 जवाब

सही सिंटैक्स निम्नलिखित है:

io.to('some room').emit('some event');
0
sidewinder 9 जून 2017, 18:21
मैंने पहले यह कोशिश की है। साथ में: io.sockets.in('room').emit('event'); io.sockets.to('room').emit('event'); नामस्थान io.of('').emit('event'); io.of('/').emit('event'); मैंने समाधानों के लिए चारों ओर देखा है और यद्यपि वे सभी वाक्य रचना की सीमा के आसपास वही कहते हैं जो आपके पास है, मेरे मुवक्किल को अभी भी घटना से ट्रिगर नहीं किया गया है।
 – 
user8137803
9 जून 2017, 18:24
फिर दोबारा कोशिश करें। और io.sockets.connected[clientsArr[clientId]].emit('connectToRoom') के बजाय socket.emit('connectToRoom') आज़माएं
 – 
sidewinder
9 जून 2017, 18:28
सॉकेट.एमिट ('ईवेंट') ठीक काम करता है। मैंने कुछ ओपन सोर्स सॉकेट.आईओ कोड के सोर्स कोड को देखा है। क्या समस्या यह हो सकती है कि मैंने कैसे socket.io स्थापित किया है? (मैं आपके उत्तर की बहुत सराहना करता हूं।)
 – 
user8137803
9 जून 2017, 18:30

मैंने अपनी समस्या का समाधान कर लिया है। इस कार्यक्रम में मुद्दा यह है कि मैंने अपना कार्यक्रम कैसे बनाया है। प्रोग्राम को "नॉन-डायनेमिक रूम" तरीके से कोडित किया गया है। मैंने केवल एक गेम इंस्टेंस को संभालने के लिए प्रोग्राम को कोड किया है। प्रत्येक कमरे के लिए एकाधिक गेम इंस्टेंस नहीं।

यह इस तथ्य के कारण है कि मैं सभी कमरों के लिए एक "गेम" उदाहरण का उपयोग कर रहा हूं। प्रत्येक कमरे के सभी खेल समान कोड का उपयोग करेंगे। चूंकि मैं प्रत्येक अद्वितीय कमरे के लिए अलग-अलग अद्वितीय गेम इंस्टेंस चला रहा हूं, इसलिए मुझे प्रत्येक संबंधित गेम इंस्टेंस के लिए अद्वितीय कोड भी बनाना होगा। यह प्रोग्राम प्रत्येक संबंधित गेम इंस्टेंस के लिए अद्वितीय कोड नहीं बनाता है। इसलिए यह काम नहीं करता है।

मैंने प्रत्येक व्यक्तिगत कमरे के लिए गतिविधियों को संभालने के लिए कार्यक्रम को मॉड्यूलर तरीके से पुनर्गठित किया है।

0
user8137803 10 जून 2017, 12:09