我在 Javascript 中有这段代码:
function checkUpdate() {
setInterval(updateState, 1000, document.getElementById('serverId').textContent);
}
function updateState(serverId) {
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == XMLHttpRequest.DONE) {
const reponse = request.responseText
if (reponse != document.getElementById('lastCommand').textContent) {
document.getElementById('lastCommand').textContent = reponse
eval(document.getElementById('lastCommand').textContent)
}
}
}
request.open('GET', '/updateState?serverId='+serverId, true);
request.send(null);
}
这里是 Python 方面:
@app.route('/updateState')
def updateState():
serverId = int(request.args['serverId'])
for instance in instances:
try:
if serverId == instance.id: return instance.lastCommand[-1]
except IndexError:
return 'Error'
return 'Error'
我希望 JavaScript 定期请求服务器(Flask)在同一游戏实例中保持用户之间的同步。服务器返回任何玩家之前执行的最后一个命令。如果请求的结果与之前不一样,那么玩家已经做出了动作。所以我们把它做成 Client-Side,用 JavaScript 函数来同步。问题是有时在执行命令的同时发送了请求。通常,服务器会执行命令,然后接收请求并返回结果。但是当它有时到达时,服务器的响应就像没有执行任何命令一样,就像他没有处理命令一样,并且在最后执行的命令上没有返回任何变化,所以没有附加客户端,因为没有任何变化。我准确地说,当命令和请求不同时发送时,它工作正常,但每次请求延迟 1 秒,它有很多机会同时发送。
我尝试不让 JavaScript 每秒请求一次,而是请求一次,等待服务器响应。而且只有当服务器执行命令时,它才会返回对请求的响应。我设法完成了 JavaScript 端,但为了让服务器等待命令而不中断 Flask 执行,我没有这样做。我尝试使用异步功能,但我不是这些专家。
在此先感谢大家,并祝福我糟糕的英语!
看起来你可以使用套接字来解决这个问题。
使用 socketio,它应该如下所示:
客户:
socket.on('commandUpdate', (lastCommand) => {
document.getElementById('lastCommand').textContent = lastCommand
eval(document.getElementById('lastCommand').textContent)
})
烧瓶服务器:
from flask_socketio import emit
@app.route('/updateState')
def updateState():
emit('commandUpdate', request.args['lastCommand'])
我还会在 socketio 上在线阅读以建立客户端和服务器之间的连接。
希望这有帮助。