在 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 中搜索对手的主要内容,如果未能解决你的问题,请参考以下文章