2

私はJavaで、2〜4人のプレーヤーがいるクラシックな5枚のカードポーカーをシミュレートするゲームを作成しています。ほとんどのデータはサーバーで処理されますが、オンラインサーバーを使用できないため、ユーザーがローカルサーバーを作成してゲームをホストできるようにすることを考えています。

今、私はIPを使用してゲームに接続することを強制したくないので、ユーザー内に利用可能なすべてのゲームを表示できる「検出」インターフェイスを作成しました。これは、UDPプロトコルと共通グループのブロードキャスト調査を使用して行われます。

(コードは、実行されたアクションのみを表示するように簡略化されています。ここに示されているように機能しない場合があります)

クライアント

MulticastSocket socket = new MulticastSocket(6020);
InetAddress group = InetAddress.getByName("226.0.0.1");
socket.joinGroup(group);

DatagramPacket packet = new DatagramPacket(new byte[] {(byte) 0xF0}, 1, group, 6020);
socket.send(packet);

while(true) {
    buf = new byte[1];
    packet = new DatagramPacket(buf, buf.length);
    socket.receive(packet);

    if(packet.getData()[0] == 15) {
        Socket client = new Socket(packet.getAddress(), 6020);
    }
}

サーバ

MulticastSocket socket = new MulticastSocket(6020);
InetAddress group = InetAddress.getByName("226.0.0.1");
socket.joinGroup(group);

// new thread listening on port 6020 TCP
ServerSocket server = new ServerSocket(6020);
new Thread(new Runnable() {

            public void run() {
                while(true) {
                    // new thread communicating with client and back listening on port 6020
                    new ServerThread(server.accept());
                }
            }
}).start();

// listening on port 6020 UDP
byte[] buf;
DatagramPacket packet;
while(true) {
    buf = new byte[1];
    packet = new DatagramPacket(buf, buf.length);
    socket.receive(packet);

    if(packet.getData()[0] == -16) {
        DatagramPacket packet = new DatagramPacket(new byte[] {(byte) 0x0F}, 1, packet.getSocketAddress());
        socket.send(packet);
    }
}

クライアントはポート6020でUDPブロードキャストパケットを送信します。サーバーがこのパケットをバイト0xF0で構成されている場合に受信すると、サーバーはバイト0x0Fをクライアントに送り返します。すべてのクライアントはポート6020でもリッスンしており、バイト0x0Fで構成されるパケットを受信すると、ポート6020でサーバーへの新しい接続TCPを開始します。

私の質問:この「発見」システムを実現するためのより良い方法はありますか?これはローカルネットワークでのみ機能することを知っていますが、ローカルサーバーを使用して検出を「外部」に拡張することは可能ですか?

4

1 に答える 1

1

プレーヤーをサーバーに接続できる(またはサーバーのリストを提供できる)既知のブローカーをセットアップしたい場合を除いて、運が悪い可能性があります。ご存知のように、マルチキャストとブロードキャストは通常​​、ほとんどのスイッチによってWANに送信されません(そして間違いなくインターネットを通過できません)。

既知のサーバー/ブローカーの設定に関する問題が、ホーム接続と動的IPを使用していることである場合は、動的DNSを調べることをお勧めします。IPが変更されると、IPを指すように自動的に変更されるサブドメインをシステムに設定できるようにするプロバイダーは数多くあります。

于 2012-05-04T18:17:29.717 に答える