在 socket.io 中搜索对手

Posted

技术标签:

【中文标题】在 socket.io 中搜索对手【英文标题】:Search for opponent in socket.io 【发布时间】:2016-12-11 18:52:46 【问题描述】:

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

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

逻辑应该像这样工作。

我试过这样。

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(); 的客户端,使用那里的 id 作为键并将游戏数据作为客户端对象的一部分,我可能会更有意义。 对不起,我没明白你的意思。 【参考方案1】:

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

您可以在此基础上建立一种简单的方法;

客户端.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;

服务器.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中,每个人在连接到服务器时都被放入了自己的默认房间,所以它不会被删除。

【讨论】:

以上是关于在 socket.io 中搜索对手的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 是聊天模块的理想选择吗

在多个节点上部署 socket.io 应用程序

18. socket io

Socket.io - 客户端断开连接后手动重新连接

Socket.io 移动到不同的域名后抛出 connect_error “服务器错误”

如何使用 socket.io-p2p 在房间内建立对等连接?