【发布时间】:2012-07-09 22:22:44
【问题描述】:
我正在使用 node.js 构建一个基于浏览器的实时多人游戏。目前,我让客户端通过 socket.io 将用户输入发送到游戏逻辑服务器,并将游戏世界的快照发送回客户端进行渲染。
以下是代码的简化版本。是否可以使用 UDP 将数据从基于浏览器的客户端发送到服务器,反之亦然?我知道 Node.js 有一个UDP module,但我不确定如何以这种方式实现它。
任何帮助将不胜感激。谢谢。
服务器:
var server = http.createServer(handler).listen(8888);
var iosocket = io.listen(server);
// request/response handler
function handler(req, res){
...
}
iosocket.sockets.on('connection', function(socket){
console.log("[x] Socket listener started");
socket.on('msg', function(data){
console.log( " [-] incoming message);
});
});
...
iosocket.sockets.emit("message", msg);
客户:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
socket.on('connect', function(){
console.log("connected to server");
});
socket.on('message', function(message){
console.log('received message');
});
</script>
</head>
<body>
<canvas id='canvas' width="400" height="400">Canvas</canvas>
</body>
</html>
【问题讨论】:
-
你不能。浏览器仅支持 HTTP。其中一些也支持 WebSockets(其他可以用 Flash XMLSocket 模拟 WebSockets)。就是这样。顺便说一句:为什么是 UDP?使用 TCP(即 WebSockets)更可靠。
-
@freakish 在阅读了有关 UDP 与 TCP 主题的各种文章后,我追求的是速度而不是可靠性......我猜他们当时不是在谈论基于浏览器的游戏?
-
嗯,这取决于您实际构建的游戏类型。如果您打算在浏览器中制作另一个 Quake,那么也许您应该忘记它。 :) 另一方面,如果您不需要每秒制作大量快照,那么 TCP 就足够了。最后请注意,一些非常棒的游戏仍然使用 TCP,例如:魔兽世界。
-
@freakish 魔兽世界几乎不能被视为实时游戏,老实说。如果你正在设计一个带有射弹或移动碰撞盒的游戏,那么你几乎肯定想要某种形式的 UDP,而 TCP 则用于对时间不敏感的东西。如果您要制作一款基于面向方向、按下一个键并等待一秒钟(WoW)进行攻击的游戏,那么 TCP 可能就可以了。
标签: javascript node.js networking udp