繁体   English   中英

如何使用socket.io,express和node.js使服务器端FUNCTION执行到特定的命名空间

[英]How to make a server side FUNCTION execute to a particular namespace room only using socket.io, express and node.js

我正在使用socket.io,express和node.js开发在线多人游戏,其中服务器检测到有多少用户连接到命名空间上的特定房间,然后启动游戏。 我的问题是我已经在服务器端编写了游戏功能,当我调用该函数只执行到具有2个以上玩家的命名空间上的特定房间时,该功能在所有同时连接的命名空间中执行。 我希望函数只在那些有超过2个用户连接到它们的命名空间中以不同的间隔执行,因为我的游戏处理时间是一轮又一轮。我试图使用带有express和node.js的socket.io实现这一点。 任何帮助将不胜感激。

   //on the server side

    var express = require('express');
    var app = express();
    var fs = require('fs');
    var path = require('path');
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    var logger = require('winston');
    var port = process.env.PORT || 4000;

    var mySocket= io.of('/games');

    //this function shows the game question 

    function showGameQuestion() {
         var question = 'How many states do we have in america?';
         return question
     }

    // this is the main game function where the game logic goes

    function playGame(gameRoom) {
       status = "chat";
       countdown = 10;
       setInterval(function() {
           countdown--;
           if (status == "chat") {
               showChat = 'you can chat now';
               if (countdown <= 0) {
                  status = "play";
                  countdown = 20;
                  showLetter = showGameQuestion();
                  mySocket.in(gameRoom).emit('go', { countdown: countdown, 
                  showMessage:showLetter, status:status });

               }
             }
             console.log(countdown);
         },1000)
   }
  //creating the socket connection

  mySocket.on('connection', function (socket) {
      socket.on('addPlayer', function (data) {
      socket.getRoomName = data.getRoomName;
      socket.join(socket.getRoomName);
      mySocket.in(socket.getRoomName).clients((error, clients) => {
      if (error) throw error;
         numUsers = clients.length;
         if(numUsers >=3){
            //calling the play game function
            playGame(socket.getRoomName);

          }
        })
     });


   //on the client side 

   var socket = io("/games");
     $("#joinBtn").click(function(){
       getRoomName = $("#roomName").val();
       socket.emit('addPlayer', getRoomName)
      })
     socket.on('go', function(data){
     $("#showQuestion").text(data.showLetter);
     })

我期望的是当用户连接到特定房间,例如命名空间上的绿色房间时,它应该计算房间中有多少用户,如果他们超过2,则仅在命名空间上的特定频道中启动游戏,而是正在开始游戏回合,同时在命名空间上连接的所有通道上显示问题。

改变mySocket.in(gameRoom).emit('go'

io.to(gameRoom).emit('go'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM