Jquery Socket.io ID问题,ID错误

Jquery Socket.io ID问题,ID错误,jquery,node.js,ajax,express,socket.io,Jquery,Node.js,Ajax,Express,Socket.io,让我们先说我不是程序员,我两天前才学会了nodeJS、Jquery、AJAX和Socket.IO。就像在一次聚会上一样,我对他们一无所知 我正在尝试创建一个类似jackbox的系统,并尽可能创建房间和添加玩家。但是socket.id出了问题,它总是为我添加的每个玩家返回相同的id。这是遇到问题的代码(注意:房间创建由unity调用,它似乎工作得很好,因为房间代码和id的存储方式与应该的完全相同): 我很确定,我可能在做一些不被允许的事情。我认为这可能与试图从io.on(‘连接’)中运行app.p

让我们先说我不是程序员,我两天前才学会了nodeJS、Jquery、AJAX和Socket.IO。就像在一次聚会上一样,我对他们一无所知

我正在尝试创建一个类似jackbox的系统,并尽可能创建房间和添加玩家。但是socket.id出了问题,它总是为我添加的每个玩家返回相同的id。这是遇到问题的代码(注意:房间创建由unity调用,它似乎工作得很好,因为房间代码和id的存储方式与应该的完全相同):

我很确定,我可能在做一些不被允许的事情。我认为这可能与试图从io.on(‘连接’)中运行app.post有关,如果是这种情况,我对如何解决它有点迷茫。我需要存储在阵列中的玩家的socket.id,以便以后可以使用这些id发送重要的游戏数据

我的控制台日志(注意,在此日志中,所有ID都是相同的,但情况并非总是如此):

为了完成论者的利益,我将补充其他方面: app.js:

rooms.ejs

<!DOCTYPE html>
<html>
  <head>
    <title>Todo List</title>
    <script
      src="https://code.jquery.com/jquery-3.5.0.min.js"
      integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ="
      crossorigin="anonymous"></script>
    <link href="/assets/styles.css" rel="stylesheet" type="text/css" />
    <script src="/assets/zoomFriendsAjax.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.js"></script>
  </head>
  <body>
    <script src="/assets/sockets.js"></script>
    <h2>Welcome To ZoomFriends</h2>

    <div id="pagecontent">
      <div id="serverform">
        <form>
          <label for="servercode"><strong>Server Code:</strong></label>
          <input type="text" id="servercodeinput" name="servercode" placeholder="Insert your server code here..." required>
          <label for="nickname"><strong>Your Nickname</strong></label>
          <input type="text" id="nickname" name="nickname" placeholder="Insert your nickname here..." required>
          <button type=submit>join room</button>
        </form>
      </div>
      <div id="connpage">
        <h2>Connected to server</h2>
        <button id=startgame>Start Game if all players have joined!</button>
      </div>
      <div id="gamepage">
        <h2>Game is Started</h2>
      </div>
    </div>
  </body>
</html>
styles.css

body{
    background: #0d1521;
    font-family: tahoma;
    color: #989898;
    text-align: center;
}

#todo-table{
    position: relative;
    width: 95%;
    background: #090d13;
    margin: 0 auto;
    padding: 20px;
    box-sizing: border-box;
}

#todo-table form:after{
    margin: 0;
    content: '';
    display: block;
    clear: both;
}

#connpage{
    display: none;
}

#gamepage{
    display: none;
}
#servercodeinput{
    text-transform: uppercase;
}

input::placeholder {
  font-style: italic;
}

input[type="text"]{
    width: 100%;
    padding: 20px;
    background:#181c22;
    border: 0;
    float: left;
    font-size: 20px;
    color: #989898;
    text-align: center;
}

label{
    width: 100%;
    padding: 20px;
    background:#23282e;
    border: 0;
    float: left;
    font-size: 20px;
    color: #989898;
    text-align: center;
}

button{
    padding: 20px;
    width: 100%;
    float: left;
    background: #23282e;
    border: 0;
    box-sizing: border-box;
    color: #fff;
    cursor: pointer;
    font-size: 80px;
}

ul{
    list-style-type: none;
    padding: 0;
    margin: 0;
}

li{
    width: 100%;
    padding: 20px;
    box-sizing: border-box;
    font-family: arial;
    font-size: 20px;
    cursor: pointer;
    letter-spacing: 1px;
}

li:hover{
    text-decoration: line-through;
    background: rgba(0,0,0,0.2);
}

h1{
    background: url(/assets/logo.png) no-repeat center;
    margin-bottom: 0;
    text-indent: -10000px;
    text-align: center;
}
sockets.js

//make connection
var socket = io.connect('95.97.158.61:4000');
最后是完整的ZoomFriendsController.js:

var bodyParser = require('body-parser');
var mongoose = require('mongoose');

//Connect to database
mongoose.connect('mongodb+srv://SebastiaanVW:Test1234@todo-m1zp6.mongodb.net/test?retryWrites=true&w=majority', { useNewUrlParser: true , useUnifiedTopology: true })

//Create a schema - this is a blueprint
var roomSchema = new mongoose.Schema({
  room: String
  //players: Array
});

//create a model
var Rooms = mongoose.model('Room', roomSchema)

var urlencodedParser = bodyParser.urlencoded({extended: false});

//Start Functions
module.exports = function(app,io){

var rooms = [];
var myroomindex = -1;

//Check if socket is connected
io.on('connection',function(socket){
    console.log('made socket connection:'+socket.id);


      //if submit button is pressed on the login form
      app.post('/button', urlencodedParser, function(req, res){
      console.log(socket.id);
      //put the player data in message variable
      //var message = req.body.player;
      //check if a roomcode exists with the entered roomcode
      var found = rooms.some(el => el.roomcode === req.body.room);
      //if it exists
      if (found){
        //find the index in the room array of that room
        var targetindex = rooms.findIndex(element => element.roomcode === req.body.room);
        //send a message to that room in unity that you want to join
        io.to(rooms[targetindex].gamesocketid).emit('joinroom', {player: req.body.player, room: req.body.room, socket: socket.id});
        //add the player to the players array of that room
        rooms[targetindex].players.push({nickname: req.body.player, id: socket.id});
        //log the addition of the player to the console
        console.log('player ' + req.body.player + ' joined room ' + req.body.room + ' with socket ID ' + socket.id);
        //Log the room itself to the console
        console.log(rooms[targetindex]);
        //send a response with the data. to tell you successfully added the player to ajax
        res.json(rooms[targetindex]);
      } else {
        console.log('room not found');
        res.json(rooms[targetindex]);
      }
    });

    //if submit is pressed on the startgame button
    app.post('/start', urlencodedParser, function(req, res){
        console.log('game started');
        var goingwell = true;
        io.to(rooms[myroomindex].gamesocketid).emit('gamestarted',{started: true});
        rooms[myroomindex].players.forEach(function(item,i){
          var tempsocket = rooms[myroomindex].players[i].socket
          console.log(tempsocket);
          io.to(tempsocket).emit('gamestarted',{started: true});
        });
        res.json(goingwell);
    });

    socket.on('createroom',function(data){
      JSON.stringify(data);
      console.log('Game with socket id ' + socket.id + ' created a room with room code ' + data.roomcode );
      var players = [];
      rooms.push({roomcode: data.roomcode, gamesocketid: socket.id, players: players});
      console.log(rooms);
      //console.log('room code ' + RoomJSON.roomcode);
    });

    socket.on('destroyroom',function(data){
      JSON.stringify(data);
      console.log('Destroy a room with room code ' + data.roomcode );
      rooms = rooms.filter(function(value){
        return value.roomcode !== data.roomcode;
      });
    });

    socket.on('gamestarted',function(data){
        //res.render('gamestarted');
        console.log('recieved gamestarted');
    });
});



app.get('/', function(req, res){
  res.render('rooms');
});

};

我知道那里有很多东西我还没有用,还有一些东西不起作用,比如myroomindex值。但现在我需要解决socketid问题。基本上我的所有玩家在我的数组中都得到了相同的socket ID。谢谢你看一看!

你不能把
app.post('/button',…)
放在
io.on里面('connection',…)
。无法以这种方式构建它。这意味着每次获得新的socket.io连接时,都会添加一个额外的重复
app.post()
handler。然后,每当该路由被命中时,它们都将竞争该路由,只有安装的第一个将获胜,因此无论哪个客户端发送POST请求,它将始终使用连接的第一个socket.id

您必须记住,
app.xxx()
为所有用户注册路由,这些路由在您的服务器的生命周期中是永久的。它们不仅仅适用于刚连接到socket.io的用户

相反,您需要将
app.post()
移动到
io.on('connection,…)
之外,以下是一些选项:

  • 从客户端发送带有POST数据的
    socket.id
    (不太可取,因为它可能被欺骗)
  • 从socket.io cookie获取它(如果可以)
  • 当socket.io连接连接时,将其保存在cookie中,然后在获取
    app.post()时,您可以从该cookie中获取它
  • 不要使用表单post。只需在socket.io消息中发送数据,您就可以知道它是哪个套接字

  • 我最喜欢的可能是#4。

    可能是与服务器和客户端相关的东西。也许……我不知道,这东西对我来说是新的,我只是把它拼凑起来了……谢谢,这是我所期望的,但很高兴有更有经验的人能为我澄清。当你说不要使用form post时,那会怎样,我需要一个球员的名字,房间号与socket.id相结合,以便能够来回发送消息并知道我在说谁。您能稍微澄清一下无post版本的工作原理吗?@SebastiaanvanWaardenberg-您仍然创建相同的HTML表单,但当用户按send或任何按钮时,您不会执行表单post。相反,您可以使用客户端Javascript从表单元素中获取数据值,将它们放入一个对象中,并通过socket.io消息将该数据发送到服务器。当服务器收到该消息时,它将准确地知道它来自哪个socket.io socket和socket.id。
    $(document).ready(function(){
    
    
      $('#serverform').on('submit', function(){
    
          var player = $('input[type="text"]#nickname');
          var room = $('input[type="text"]#servercodeinput');
          var joindata = {player: player.val(), room: room.val().toUpperCase()};
    
          $.ajax({
            type: 'POST',
            url: '/button',
            data: joindata,
            success: function(data){
              //do something with the data via front-end framework
              //location.reload();
              //alert('button pressed');
    
              serverconnected();
    
            }
          });
    
    
    
    
          return false;
    
      });
    
      $('#startgame').on('click', function(){
        //alert('button pressed');
        var started = true;
    
        $.ajax({
          type: 'POST',
          url: '/start',
          data: started,
          success: function(data){
            //do something with the data via front-end framework
            //location.reload();
            gamestarted();
    
          }
        });
    
        return false;
      });
    
      function serverconnected(){
        $('#connpage').show();
        $('#serverform').hide();
      }
    
      function gamestarted(){
        alert('gamestarted function happening');
        $('#gamepage').show();
        $('#connpage').hide();
      }
    
      function nosuchroom(){
        alert('Wrong Room Name');
      }
    
    });
    
    body{
        background: #0d1521;
        font-family: tahoma;
        color: #989898;
        text-align: center;
    }
    
    #todo-table{
        position: relative;
        width: 95%;
        background: #090d13;
        margin: 0 auto;
        padding: 20px;
        box-sizing: border-box;
    }
    
    #todo-table form:after{
        margin: 0;
        content: '';
        display: block;
        clear: both;
    }
    
    #connpage{
        display: none;
    }
    
    #gamepage{
        display: none;
    }
    #servercodeinput{
        text-transform: uppercase;
    }
    
    input::placeholder {
      font-style: italic;
    }
    
    input[type="text"]{
        width: 100%;
        padding: 20px;
        background:#181c22;
        border: 0;
        float: left;
        font-size: 20px;
        color: #989898;
        text-align: center;
    }
    
    label{
        width: 100%;
        padding: 20px;
        background:#23282e;
        border: 0;
        float: left;
        font-size: 20px;
        color: #989898;
        text-align: center;
    }
    
    button{
        padding: 20px;
        width: 100%;
        float: left;
        background: #23282e;
        border: 0;
        box-sizing: border-box;
        color: #fff;
        cursor: pointer;
        font-size: 80px;
    }
    
    ul{
        list-style-type: none;
        padding: 0;
        margin: 0;
    }
    
    li{
        width: 100%;
        padding: 20px;
        box-sizing: border-box;
        font-family: arial;
        font-size: 20px;
        cursor: pointer;
        letter-spacing: 1px;
    }
    
    li:hover{
        text-decoration: line-through;
        background: rgba(0,0,0,0.2);
    }
    
    h1{
        background: url(/assets/logo.png) no-repeat center;
        margin-bottom: 0;
        text-indent: -10000px;
        text-align: center;
    }
    
    //make connection
    var socket = io.connect('95.97.158.61:4000');
    
    var bodyParser = require('body-parser');
    var mongoose = require('mongoose');
    
    //Connect to database
    mongoose.connect('mongodb+srv://SebastiaanVW:Test1234@todo-m1zp6.mongodb.net/test?retryWrites=true&w=majority', { useNewUrlParser: true , useUnifiedTopology: true })
    
    //Create a schema - this is a blueprint
    var roomSchema = new mongoose.Schema({
      room: String
      //players: Array
    });
    
    //create a model
    var Rooms = mongoose.model('Room', roomSchema)
    
    var urlencodedParser = bodyParser.urlencoded({extended: false});
    
    //Start Functions
    module.exports = function(app,io){
    
    var rooms = [];
    var myroomindex = -1;
    
    //Check if socket is connected
    io.on('connection',function(socket){
        console.log('made socket connection:'+socket.id);
    
    
          //if submit button is pressed on the login form
          app.post('/button', urlencodedParser, function(req, res){
          console.log(socket.id);
          //put the player data in message variable
          //var message = req.body.player;
          //check if a roomcode exists with the entered roomcode
          var found = rooms.some(el => el.roomcode === req.body.room);
          //if it exists
          if (found){
            //find the index in the room array of that room
            var targetindex = rooms.findIndex(element => element.roomcode === req.body.room);
            //send a message to that room in unity that you want to join
            io.to(rooms[targetindex].gamesocketid).emit('joinroom', {player: req.body.player, room: req.body.room, socket: socket.id});
            //add the player to the players array of that room
            rooms[targetindex].players.push({nickname: req.body.player, id: socket.id});
            //log the addition of the player to the console
            console.log('player ' + req.body.player + ' joined room ' + req.body.room + ' with socket ID ' + socket.id);
            //Log the room itself to the console
            console.log(rooms[targetindex]);
            //send a response with the data. to tell you successfully added the player to ajax
            res.json(rooms[targetindex]);
          } else {
            console.log('room not found');
            res.json(rooms[targetindex]);
          }
        });
    
        //if submit is pressed on the startgame button
        app.post('/start', urlencodedParser, function(req, res){
            console.log('game started');
            var goingwell = true;
            io.to(rooms[myroomindex].gamesocketid).emit('gamestarted',{started: true});
            rooms[myroomindex].players.forEach(function(item,i){
              var tempsocket = rooms[myroomindex].players[i].socket
              console.log(tempsocket);
              io.to(tempsocket).emit('gamestarted',{started: true});
            });
            res.json(goingwell);
        });
    
        socket.on('createroom',function(data){
          JSON.stringify(data);
          console.log('Game with socket id ' + socket.id + ' created a room with room code ' + data.roomcode );
          var players = [];
          rooms.push({roomcode: data.roomcode, gamesocketid: socket.id, players: players});
          console.log(rooms);
          //console.log('room code ' + RoomJSON.roomcode);
        });
    
        socket.on('destroyroom',function(data){
          JSON.stringify(data);
          console.log('Destroy a room with room code ' + data.roomcode );
          rooms = rooms.filter(function(value){
            return value.roomcode !== data.roomcode;
          });
        });
    
        socket.on('gamestarted',function(data){
            //res.render('gamestarted');
            console.log('recieved gamestarted');
        });
    });
    
    
    
    app.get('/', function(req, res){
      res.render('rooms');
    });
    
    };