Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js UDP用于实时多人游戏_Javascript_Node.js_Networking_Udp - Fatal编程技术网

Javascript Node.js UDP用于实时多人游戏

Javascript Node.js UDP用于实时多人游戏,javascript,node.js,networking,udp,Javascript,Node.js,Networking,Udp,我正在使用node.js构建一个基于浏览器的实时多玩家游戏。目前,我让客户端通过socket.io将用户输入发送到游戏逻辑服务器,并将游戏世界的快照发送回客户端进行渲染 下面是代码的简化版本。是否可以使用UDP将数据从基于浏览器的客户端发送到服务器,反之亦然?我知道Node.js有一个新的功能,但我不确定如何以这种方式实现它 任何帮助都将不胜感激。多谢各位 服务器: var server = http.createServer(handler).listen(8888); var iosocke

我正在使用node.js构建一个基于浏览器的实时多玩家游戏。目前,我让客户端通过socket.io将用户输入发送到游戏逻辑服务器,并将游戏世界的快照发送回客户端进行渲染

下面是代码的简化版本。是否可以使用UDP将数据从基于浏览器的客户端发送到服务器,反之亦然?我知道Node.js有一个新的功能,但我不确定如何以这种方式实现它

任何帮助都将不胜感激。多谢各位

服务器:

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>

试验
socket.on('connect',function(){
日志(“连接到服务器”);
});
socket.on('message',函数(message){
console.log(“收到的消息”);
});
帆布

通常,浏览器不支持UDP连接。具体来说,有些浏览器确实如此。Google Chrome有一个套接字api:

[2012/10/29编辑为socket不再是实验性的-PhilH]

您也可以使用来自本机客户端接口的套接字API(不确定,只是猜测)

如果你打算在不久的将来在浏览器上做任何实时的事情,Websockets可能是你最好的选择,但它们只是TCP

关于您对UDP与TCP速度的评论,UDP将始终更快。TCP提供订购和交付保证(这意味着可能的重试和保留其他数据包,直到丢失的数据包最终到达其目的地),而UDP只承诺发送一次,而不关心之后会发生什么。UDP只发送它的数据包一次,你需要弄清楚它是否丢失了。当/如果您收到大量UDP数据包时,如果顺序很重要,您需要在数据有效负载中对其进行编码,以便能够找出原因

一般来说,UDP对于丢失一些通常不重要的数据包以及只有最新数据包才真正重要的数据包来说是非常好的。一个游戏通常可以使用TCP流,其中排序和保证交付很重要(重要的东西),UDP流用于对象移动等(其中只有最新的位置真正重要,如果一个更新丢失了,只要每个包包含完整的位置就不重要[而不是所有包都重要的增量])


对于您自己的游戏,我建议首先在TCP上实现它,然后当您有更多的经验时,您可以尝试将时间关键的内容(顺序和丢失的数据包无关紧要)移动到单独的UDP流中。有许多项目失败了,因为人们首先使用UDP,然后尝试在其上附加订购和交付保证,有效地尝试重新实现TCP。这就是为什么用另一种方式进行更新更有意义。

实时应用程序通常是接收至少30 Hz且抖动小于10%的数据更新的应用程序。TCP/IP是可靠的,但如果不偶尔出现抖动,就无法以该速率定期发送更新。这是因为TCP是握手和确认,以确保可靠的传输,这会妨碍发送快速、定期、平滑的更新。UDP是一种更简单的协议,其中套接字数据为fire-and-forget。这本身就是一个问题,但这个问题比TCP/IP的抖动差更容易克服。根据我的经验,UDP是唯一的出路,也是为什么实时应用程序在VoIP中使用RTP等协议中使用UDP的原因

var server = require('http').createServer();

require('dgram-browserify').listen(server);

server.listen(8080);

Web套接字也是错误的希望,因为它是基于TCP的协议。我使用自定义UDP套接字,发送方和接收方在其中维护一个序列号,它可以告诉您数据包是否丢失、重复或无序,以及WAN网络上的所有问题。找到使用UDP和检测入站数据包以测量性能的方法

你不能。浏览器只支持HTTP。其中一些还支持WebSocket(另一些可以使用FlashXMLSocket模拟WebSocket)。就这样。顺便问一下:为什么是UDP?使用TCP(即WebSockets)更可靠。@奇怪的是,在阅读了关于UDP与TCP的各种文章之后,我追求的是速度而不是可靠性。。。我猜他们当时不是在谈论基于浏览器的游戏吗?嗯,这取决于你实际上在构建什么样的游戏。如果您打算在浏览器中再次震动,那么也许您应该忘记它。:)另一方面,如果您不需要每秒创建大量快照,那么TCP就足够了。最后请注意,一些真正伟大的游戏仍然使用TCP,例如:《魔兽世界》。@老实说,古怪的《魔兽世界》几乎不能被视为实时游戏。如果你正在设计一个带有投射物或移动点击框的游戏,那么你几乎肯定会想要某种形式的UDP,并将TCP混合到对时间不敏感的东西中。如果你要做一个游戏,其中攻击是基于面向一个方向,按下一个键并等待一秒钟(哇),那么TCP可能很好。一般来说,这是一个很好的答案,但请注意,TCP不是建立在UDP之上的:两者都是建立在IP数据报之上的。UDP只在IP上添加了很少的端口号以外的内容。这种区别很重要,因为TCP端口和UDP端口位于单独的数字空间中。例如,TCP端口80完全不同,与UDP端口80无关。@SethNoble&Marius。如果我以每秒20的速率从服务器向客户端发送游戏世界快照,TCP会在客户端造成问题吗?像UDP这样的技术是否仍然适用于TCP?谢谢。吉马,这取决于很多因素,比如发送端和接收端之间的带宽和延迟。除非您在局域网上,否则您需要将视图更新帧率和“网络帧率”解耦。高级技术将尝试检测并适应任何条件(减少更新以适应带宽和延迟)。除了马吕斯所说的,记住如果TCP