我正在尝试在node.js中使用express在socket.io中创建一个脚本,以寻找对手。

一个房间中只能有两个玩家,这意味着当没有空闲房间时,它应该创建一个新房间。

逻辑应该像这样工作。

javascript - 在socket.io中搜索对手-LMLPHP

我尝试过这样。

io.on('connection', function (socket) {
    socket.on('search room', function() {
        //io.sockets.adapter.rooms

        for (var x in io.sockets.adapter.rooms) {
            if (x !== socket.id) {
                socket.opponent = x;
                socket.join(x);
                break;
            }
        }
    });
});


问题:


如您所见,我的代码搜索对手,但是如果找不到对手,他应该等待其他人。
如何检查播放器已经在播放,最好的方法是什么?
当用户加入房间时,其默认房间不会被删除。

最佳答案

在更复杂的系统中,定义您自己的客户端对象(代表每个已连接的每个人以及他们当前连接的房间)的情况并不少见。您也可以使用此方法来表示用户在服务器内部的当前状态。我建议您为此使用Map();,因为您可以将socket.id设置为键,并且该值具有clients对象。

您可以采用的简单方法是:

Client.js

// JavaScript source code
var client = function client(socket) {
    this.id = socket.id;
    this.state = "newly Connected";
    this.clientSocket = socket;
    this.LobbyArr = [];

    this.changeState = function (newState) {
        this.state = newState;
    }

    this.addLobby = function (lobbyId) {
        this.LobbyArr.push(lobbyId);
    }
}

module.exports = Client;


Server.js

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

app.use(express.static(__dirname + '/'));

app.get('/', function (req, res) {
    res.sendFile(__dirname + '/public/index.html');
});

//loading server side modules
var Client = require('../Client.js');

//Gets all of the connected clients
var allConnectedClients = new Map();

io.on('connection', function (socket){
  var connectedUser = new Client(socket);
  allConnectedClients.set(socket.id, connectedUser);
});



  如您所见,我的代码搜索对手,但是如果找不到对手,他应该等待其他人。


在上面的示例的基础上,如果我们为连接的客户端设置状态,则可以遍历我们的地图并找到用户当前在哪里使用this.state。如果找不到可接受的用户,那么我们可以选择向客户端发送新消息。


  如何检查播放器已经在播放,最好的方法是什么?


像以前一样,这可以通过检查用户的当前state来解决。


  当用户加入房间时,其默认房间不会被删除。


在socket.io中,每个人在连接到服务器时都会被放置在自己的默认房间中,因此不会被删除。

09-20 06:09