【发布时间】:2020-12-17 22:48:50
【问题描述】:
我制作了一个简单的多人文字游戏,其中包含一个服务器和两个客户端,其中字母块在中间翻转并显示给两个玩家。
我遇到了一个问题,即服务器只向一个客户端发出“翻转”动作而不向另一个客户端发出,即使我使用的是应该向所有人发出的 socket.emit 函数。几天来我一直在努力解决这个问题,我真的可以使用任何建议。
“翻转”动作的步骤如下。
-
一个客户端向服务器发出一个“翻转请求”。服务器收到“翻转请求”后会做两件事:(1) 开始倒计时,直到下一次翻转;(2) 向所有客户端发出“翻转请求”,以便他们知道倒计时已经开始。
-
服务器倒计时结束后,服务器向所有客户端发出“翻转”,然后所有客户端看到一个字母瓷砖被翻转。
现在的问题是:
- 服务器似乎只向其中一个客户端发送。这表现为只有一个客户可以看到翻转的瓷砖。
- 接收服务器消息的唯一客户端始终是连接到游戏的第二个客户端。也就是说,当服务器启动时,如果客户端 1 先连接,然后客户端 2 再连接,则无论谁提交翻转请求(客户端 1 或客户端 2),只有客户端 2 会看到任何图块。我觉得这很奇怪。
这是我的代码的简化版本(减去很多游戏机制,只是隔离了这个翻转动作)。代码下方还有游戏状态和控制台日志的图像。
client.js
// Emits "Flip Request" to the server when you press Enter
function keyhandler(e){
var keyCode = e.keyCode;
// enter key
if (keyCode == 13){
console.log('Requesting flip');
socket.emit('flip_request', 0);
}
}
window.addEventListener("keydown", function(e){keyhandler(e)}, false)
var socket = io();
socket.on('flip_request', function (){
console.log('Received flip request');
game.flip_status = 'Ready...';
});
socket.on('flip', function (current){
console.log('Flipped');
game.current = current;
game.flip_status = 'Flipped!';
});
server.js
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(port, function(){
console.log('listening on *:' + port);
});
io.on('connect', function(socket){
var client_ip = socket.handshake.headers['x-real-ip'];
console.log('Connected to ' + client_ip + '. ID: ' + socket.id)
check_flip_take = function(){
if (flip_waiting){
if (new Date().getTime() > flip_time){
console.log("Flip!")
game.flip();
flip_waiting = false;
socket.emit('flip', game.current)
}
}
}
// Check for pending flips and takes
setInterval(check_flip_take, 100);
socket.on('disconnect', () => {
console.log(`Player ${player_id} disconnected!`)
});
socket.on('flip_request', function(){
console.log("Received flip request")
flip_waiting = true;
flip_time = new Date().getTime() + flip_delay;
socket.emit('flip_request');
})
})
如果有用的话,这里是游戏状态的样子。如您所见,在客户端 1(左客户端)的控制台日志中,它反复显示“请求翻转”,此时客户端正在向服务器提交翻转请求。但只有右边的客户端(客户端 2)从服务器获取“翻转”事件。
【问题讨论】:
标签: javascript sockets socket.io