13

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);

クライアント:

<!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>
4

3 に答える 3

24

通常、ブラウザは UDP 接続をサポートしていません。具体的には、一部のブラウザがそうです。Google Chrome にはソケット API があります。

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

[2012/10/29 ソケットが実験的ではなくなったため編集 - PhilH]

ネイティブ クライアント インターフェースからソケット API を使用することもできます (推測のみでわかりません)。

近い将来、ブラウザ上でリアルタイムに何かをしようとするなら、おそらく Websockets が最善の策ですが、それらは TCP のみです。

UDP と TCP の速度に関するコメントについては、UDP の方が常に高速です。TCP は順序付けと配信の保証を提供します (これは、再試行が可能で、失われたパケットが最終的に宛先に到着するまで他のパケットを保持することを意味します)、UDP は一度だけ送信することを約束し、後で何が起こるかは気にしません。UDP はパケットを 1 回しか送信しないため、パケットが失われたかどうかを確認する必要があります。大量の UDP パケットを受信した場合、順序が重要な場合は、これをデータ ペイロードにエンコードして、それを把握できるようにする必要があります。

一般に、UDP は、いくつかの欠落が通常問題にならず、最新のパケットのみが重要なパケットに最適です。ゲームは通常、順序付けと保証された配信が重要な場合 (重要なもの) には TCP ストリームを使用し、オブジェクトの移動などには UDP ストリームを使用します (実際には最新の位置のみが重要であり、1 つの更新が失われた場合でも、パッケージには、[すべてのパケットが重要なデルタの代わりに] 完全な位置が含まれています)。

あなた自身のゲームでは、最初に TCP で実装することをお勧めします。それから、もう少し経験を積んだら、タイム クリティカルなもの (順序と損失パケットはそれほど問題にならない) を別の UDP ストリームに移動してみることをお勧めします。最初に UDP から始めて、その上に順序付けと配信の保証を追加し、効果的に TCP を再実装しようとしたため、多くのプロジェクトが失敗しました。これが、逆の方法で行う方が理にかなっている理由です。

于 2012-07-10T12:39:35.940 に答える
1

リアルタイム アプリケーションとは、通常、少なくとも 30 Hz で 10% 未満のジッターでデータ更新を受信するアプリケーションです。TCP/IP は信頼できますが、定期的な更新をその速度で送信することはできず、ジッターがスケールから外れることがあります。これは、TCP が信頼性の高い伝送を保証するためにハンドシェークと確認応答を行っているためであり、これが高速で定期的にスムーズな更新を送信する妨げになっています。UDP は、ソケット データがファイア アンド フォーゲットである単純なプロトコルです。これはそれ自体が問題ですが、その問題は TCP/IP の貧弱なジッターよりも簡単に克服できます。私の経験では、UDP は前進する唯一の方法であり、VoIP で使用される RTP などのプロトコル内でリアルタイム アプリケーションが UDP を使用する理由です。

Web ソケットも、TCP ベースのプロトコルであるため、期待はずれです。私は、送信者と受信者がシーケンス番号を維持するカスタム UDP ソケットを使用します。これにより、パケットが失われたか、重複しているか、順序が狂っているか、WAN ネットワーク上のすべての問題を知ることができます。UDP を使用し、インバウンド データ パケットを計測してパフォーマンスを測定する方法を見つけます。

于 2017-07-11T22:35:58.653 に答える
-6
var server = require('http').createServer();

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

server.listen(8080);
于 2013-08-27T04:58:15.547 に答える