0

私は基本的な小さなゲームを作成しており、ソケットを使用して LAN 経由でスキャンできるようにしたいと考えています。現在のコードは機能しますが、粗くて遅いです。

私の現在のコードはそのように機能します。現在のコンピューターを最初の 2 オクターブ (たとえば 192.168) 取得し、次にデュアル for ループ (0-255) を実行して 192.168.0.0 から 192.168.255.255 までスキャンします。 LAN 内のすべての IP をスキャンする非効率的な方法です。

これはコードです:

new Thread(new Runnable() {
@Override
public void run() { 
            int next = 0;
            try{
            String ipAd = InetAddress.getLocalHost().getHostAddress();
            String ipStart = ipAd.substring(0, NetHandler.nthOccurrence(ipAd, '.', 2)-1);

            Socket s;

            for(int i = 0 ; i < 255; i++){
                for(int j = 0 ; j < 255; j++){
                    s = new Socket();
                    String ip = ipStart + (i + "." + j);
                    tests++;
                    server = ip;    
                    try{
                    s.connect(new InetSocketAddress(ip, 26655), 10);
                    }catch(Exception e){
                        continue;
                    }
                    servers[next++] = ip;
                    componentList.add(new GuiButton(ids++, GuiMultiplayer.this, SpaceGame.WIDTH/2, SpaceGame.HEIGHT/4 - 60 + (50 * ids), ip));
                }
            }
            }catch(Exception e){
            }
        }
    }).start();
}

LAN ネットワーク上のすべてのデバイスを一覧表示する簡単な方法はありますか? それとも、私の大雑把で遅い解決策が唯一の方法ですか?

この怪物のプレビュー:

ここに画像の説明を入力

4

2 に答える 2

8

LAN 上で実行中のアプリのインスタンスを検出するには、通常、UDP ブロードキャストを使用します。要求元のアプリに、事前に決定されたポートで LAN のサブネット ブロードキャスト IP に単一の要求メッセージを送信させます。これにより、そのサブネットに接続されているすべての PC のそのポートにメッセージがコピーされます。他のアプリは、そのポートで UDP リッスン ソケットを開いて、リクエストを受信できます。各アプリがリクエストを受信すると、リクエスタの IP が取得され、直接応答を送信できるため、リクエスタはリプライヤを検出できます。最初の要求を送信した後、要求者は受信した応答を収集するまでしばらく待機し、必要に応じてその情報を使用できます。

于 2013-02-24T18:03:59.660 に答える
1

私の提案は、一度に複数の接続を開始できるように、アプリケーションをマルチスレッド化することです。これまでにマルチスレッド Java アプリケーションを実行したことがない場合は、 Java Concurrency チュートリアルでこれを行う方法を確認してください。

編集:これをコメントで他の人の提案と組み合わせることもできます. 実際、同時実行性を扱う前に、おそらく彼らの提案を使用するでしょう。

于 2013-02-24T15:10:33.000 に答える