我最近一直在使用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>
发布于 2018-09-20 06:48:08
Firebase实时数据库是另一种选择。
https://github.com/firebase/quickstart-js/blob/master/database/scripts/main.js
<!-- index.html file in client browser -->
<script src="/__/firebase/5.5.0/firebase-app.js"></script>
<script src="/__/firebase/5.5.0/firebase-auth.js"></script>
<script src="/__/firebase/5.5.0/firebase-database.js"></script>
<script src="/__/firebase/init.js"></script>
<script src="scripts/main.js"></script>
<!-- main.js file in client browser -->
// Create new comment.
// createNewComment, commentInput, addCommentForm is defined in the main.js
addCommentForm.onsubmit = function(e) {
e.preventDefault();
createNewComment(postId, firebase.auth().currentUser.displayName, uid, commentInput.value);
commentInput.value = '';
commentInput.parentElement.MaterialTextfield.boundUpdateClassesHandler();
};
// Listen for comments.
// addCommentElement, postElement is defined in the main.js
var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', function(data) {
addCommentElement(postElement, data.key, data.val().text, data.val().author);
});
https://stackoverflow.com/questions/52407025
复制相似问题