我尝试使用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;
}
}
});
});
问题:
答案 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中,每个人在连接到服务器时都会进入自己的默认空间,因此不会被删除。