1

特定のポートでアプリケーションをホストしているwifiネットワークにログインしている他のデバイスを検索する方法を見つけようとしています。

これらの他のデバイスのアドレスやホストしているポートを知らなくても、これらのデバイスの存在を検出するにはどうすればよいでしょうか?

発見されたら、デバイスに接続し、SocketChannels を使用してクライアント サーバー接続を確立できるはずです。

注: このアプリケーションは、ICS 以前の Android デバイスで動作することを想定しています。したがって、Wifi-Direct はありません。

4

1 に答える 1

1

すべてのピアがリッスンする既知のポートでプローブ パケットをブロードキャスト (255.255.255.255) に送信できます。これは、簡単に発見するための古き良き手法です。その他にはSSDP、またはが含まれUPnPます。

255.255.255.255は UDP ブロードキャストでのみ機能することに注意してください。

[追加] コメントするよりも、回答を拡大することを好みます。

1. 誰がブロードキャストを開始する必要がありますか?

お好きな放送機種をお選びいただけます。それらはすべて交換可能です。

モデル 1 は「求人」であり、私の意見では、私のお気に入りです。サーバー アプリケーションでリッスン ソケットを開き、一定の IP/ポート (ポートは静的である必要はありません) で開いているサービスが利用可能であることを全員に通知する広告またはより良いアナウンスブロードキャスト メッセージを定期的に送信します。通信に関心のあるピアは、指定されたエンドポイントに接続してサービスを使用するだけです。

モデル 2 は「求職」であり、サーバーはサイレントのままです。クライアントが接続を希望する場合、一般的なシークメッセージをブロードキャストします。使用可能な任意のサーバーがメッセージを受信し、返信 (ユニキャスト) するか、上記のアナウンス メッセージをブロードキャストします。

モデル 2a は「リバース ジョブ シーク」であり、クライアントがサービスの要求を一般的なメッセージとしてではなく、そのエンドポイントを含めてブロードキャストします。その後、サーバーはクライアント エンドポイントに接続しますが、クライアント ノードがサーバー ノードからのサービスを要求しているため、プロトコルは続行されます。これらは逆の役割の TCP ピアとして機能します。

2. 頻度は?

それはいくつかの要因に依存します。最終的なミリ秒数を選択することはできませんが、すべての要因を示すことはできます。まず、利用可能なサービスのスキャンが「終了」したことをクライアントがユーザーに通知するまで、クライアントはどのくらい待機する必要がありますか? 「瞬時」または「1 秒」と考えるかもしれませんが、ブロードキャスト パケットは、コミュニティで利用可能なサーバーの数に応じて、ネットワークを過負荷にする傾向があることに注意してください。

モデル 1 を選択した場合は、できるだけ早く (つまり、アプリケーションの開始時) 利用可能なサービスのリッスンを開始し、タイムアウトである時間枠内にハートビート(ブロードキャスト パケットの別の技術名) が受信されないサービスをリストから定期的に削除します。手動スキャンは、通常、ファイルのサイズに応じて、またはそれに応じて完了すると想定されています。T*2T*3TT*1.5T*1.2T

于 2012-03-30T18:34:30.567 に答える