在socket.io中搜索对手

时间:2016-12-11 18:52:46

标签: javascript express websocket socket.io

我尝试使用node.js中的express在 socket.io 中创建一个脚本,搜索对手。

只有两个玩家可以进入一个房间,这意味着当没有空闲房间时,它应该创建一个新的。

逻辑应该像这样工作。

enter image description here

我试过这样。

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;
            }
        }
    });
});

问题:

  • 正如你可以看到我的代码搜索对手,但如果找不到,他应该等待其他人。
  • 如何检查播放器是否已播放,最佳方式是什么?
  • 当用户加入房间时,他的默认房间不会被删除。

1 个答案:

答案 0 :(得分:1)

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

您可以构建的简单方法是;

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中,每个人在连接到服务器时都会进入自己的默认空间,因此不会被删除。