Я недавно заходил в node.js, чтобы сделать онлайн-игру (для образования).Читая различные уроки, я пришел к простому коду, показанному ниже.Имея код, который у меня есть, я могу общаться между клиентом и сервером, и это в основном все, что мне нужно для создания игры.Есть только одна проблема, только клиент может инициировать диалог, тогда как сервер может только ответить.В дополнение к этому мне также необходимо в любой момент времени отправить текущее состояние игры с сервера на клиент.Например, в игре для двух игроков, когда игрок отправляет команду, которая изменяет игровое состояние, это новое игровое состояние должно быть передано ОБА игрокам.
Есть ли в node.js простой способ сделать это?Я знаю, что вы не можете просто отправить сообщение клиенту, поскольку нельзя ожидать, что у клиента будет открыт порт для использования сервером, но, может быть, у клиента есть способ оставить соединение для использования сервером?Я из тех парней, которые учатся на собственном примере, поэтому будет полезен какой-то простой рабочий код.
Кстати, я веду игру на firebase, если это актуально.
index.js:
const functions = require('firebase-functions');
const express = require('express');
const app = express();
app.post('/game', (request, response) => {
request.body.randomNumber = Math.random();
console.log(request.body);
response.json(request.body);
});
exports.app = functions.https.onRequest(app);
index.html:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<input type="text" id="commandbox" onkeypress="send(this)">
<br>
<div id="display"></div>
<script>
const send = (ele) => {
if (event.key === 'Enter') {
console.log(ele.value);
const json = {
name: "John",
gender: "male",
age: 25,
message: ele.value
};
postToGame(json);
}
};
</script>
<script>
const postToGame = (json) => {
const xhr = new XMLHttpRequest();
xhr.open("POST", '/game', true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.onload = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
document.getElementById("display").innerHTML = xhr.responseText;
}
};
xhr.send(JSON.stringify(json));
}
</script>
</body>
</html>