我正在尝试在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();
,因为您可以将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中,每个人在连接到服务器时都会被放置在自己的默认房间中,因此不会被删除。