ローカルネットワーク上のサービスを検出できる必要があります(つまり、チャットアプリケーションを実行していて、このチャットを実行しているローカルネットワーク上の他のデバイスを検出したい場合)が、残念ながら、 API <16(したがって、android.net.nsdは使用できません)これは、NSDAPIを使用せずに実行できると確信しています。質問はどのようにです。何か助けはありますか?
1 に答える
少なくとも 3 つまたは 4 つのオプションがあります。
使用できます
TCP または UDP
- ブロードキャスト アドレス
- マルチキャスト アドレス
- ネットワーク内のすべてのアドレスを繰り返します
HTTP
4 外部サーバーまたは GCM (Google Cloud Messaging) などを利用する
ad.1 と 2
長所:
+簡単に実装できます。サーバーは、特定のポートのサブネット/ネットワークのブロードキャスト/マルチキャスト アドレスで定義済みの「hello」メッセージを送信します。クライアントはそのポートでリッスンし、「hello」メッセージが到着すると、サーバーの IP アドレスを自動的に認識します (パケット)
+インターネットへの接続は必要ありません
短所:
- パブリック ネットワークの中には、攻撃 (フラッディングなど) を避けるためにこのアドレスをブロックするものがあります。
広告 3.
長所:
マルチキャストとブロードキャストがブロックされている場合にできることは、サブネット全体を単純に反復することです。これは「ブルート フォース」方式ですが、特にマスクが /24 である一般的なホーム ネットワークや小規模ネットワークで機能します。反復するアドレスは 255 個しかありません。
インターネットへの接続も必要ありません
短所
マスクに /16 を指定すると、すべての IP を反復処理するのにかなりの時間がかかります
バッテリーの消耗を引き起こす可能性があります
そしてネットワークをフラッディングします。
広告。4
別のアプローチは、デバイスの「方向付けポイント」となる外部サーバーを作成することです。それぞれが独自のアドレスを送信し、同じネットワークの別のデバイスからのエントリがあるかどうかを調べます。
もちろんインターネット接続が必要です。
ですから、ブロードキャストとマルチキャストは非常に単純で多くの場所で機能するため、最初は良い考えだと思いますが、使用が許可されていないネットワークがあることに注意してください。
良い参考文献はここにありますhttp://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html