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

Rob*_*yes 13 javascript networking udp node.js

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

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

任何帮助,将不胜感激.谢谢.

服务器:

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);
Run Code Online (Sandbox Code Playgroud)

客户:

<!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>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ahl 23

通常,浏览器不支持UDP连接.特别是,有些浏览器可以.谷歌浏览器有一个套接字api:

http://developer.chrome.com/trunk/apps/socket.html

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

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

如果你想在不久的将来尝试在浏览器上做任何实时的事情,Websockets可能是你最好的选择,但那些只是TCP.

关于您对UDP与TCP速度的评论,UDP总是会更快.TCP提供订购和交付保证(这意味着可能重试并保留其他数据包直到丢失的数据包最终到达其目的地),而UDP仅承诺发送一次,而不是关心事后发生的情况.UDP只会发送一次数据包,你需要弄清楚它是否丢失了.当/如果您收到大量UDP数据包,如果订单很重要,您需要在数据有效负载中对​​此进行编码以便能够解决.

通常,UDP对于丢失少数通常无关紧要的数据包以及只有最新数据包真正重要的数据包才有用.游戏通常可以使用TCP流,其中订购和保证交付很重要(重要的东西),UDP流用于对象移动等(其中只有最新位置真正重要,如果一个更新丢失,只要每个更新都无关紧要)包中包含完整位置[而不是所有数据包都很重要的增量]).

对于你自己的游戏,我建议首先在TCP上实现它,然后当你有更多的经验时,你可以尝试将时间关键的东西(顺序和丢失的数据包更少)移动到单独的UDP流中.有许多项目失败了,因为人们首先开始使用UDP,然后尝试在其上进行订购和交付保证,有效地尝试重新实现TCP.这就是为什么以相反的方式做这件事更有意义.

  • 通常是一个很好的答案,但请注意,TCP不是建立在UDP之上:两者都建立在IP数据报之上.除了端口号之外,UDP只在IP之上添加很少的内容.这种区别很重要,因为TCP端口和UDP端口位于单独的数字空间中.例如,TCP端口80与UDP端口80完全不同且无关. (3认同)