2

ローカル ネットワークで Web サービスを使用する Android アプリケーションがあります。ユーザーがApache Tomcatを実行しているサーバーのIPアドレスを通知する構成画面があります。

現在接続されている Wi-Fi ネットワークに基づいてサーバーを自動検出する方法を探しています。つまり、スマートフォンの IP は 10.1.1.90 で、サーバーの IP は 10.1.1.254 です。

これを達成する方法はありますか?ping を使用することを考えていますが、良いアイデアかどうかわかりません。

4

5 に答える 5

2

Tomcat応答ヘッダーには、有効になっている場合にTomcatをアドバタイズするxpoweredByフィールドを含めることができます。ただし、ほとんどの場合、セキュリティ上の理由から無効になっており、デフォルトでは無効になっています。ただし、Tomcatサーバーを正確に自動検出する必要がある場合は、再度有効にすることができます。反対側から見ると、実際、サーバーにWebページを配置できる場合は、合意された署名を使用してマーキングページを配置するだけです。

サーバーのIPが不明な場合は、ネットワーク上のサーバーを検出するために次の方法を提案します。

  • 最も簡単な方法は、ブレッドキャストpingを実行することです(たとえば、ブレッドキャストアドレスはここping -b broadcast_addressで計算できます)。そのように構成されたすべてのネットワークデバイスは応答し、上記で説明したように、どれがサーバーであるかを確認します。ただし、ブロードキャストアドレスにpingを実行するには、ルート化された電話が必要です。また、ルーターはサポートしていない可能性があります。
  • DHCPサービス(ほとんどの場合ルーター)は、サーバーネットワークカードの同じMACアドレスに対して常に同じIPアドレスを発行するように構成できることがよくあります。
  • サーバーがデスクトップコンピューターまたはラップトップの場合、サーバーのアドレスがディスプレイにQRコードとして表示される可能性があります。スマートフォンが画面からコードをスキャンすることは可能であり、これはタッチスクリーンからIPアドレスを入力するよりもはるかに簡単です。QRコードには、セキュリティを強化するために自動生成されたパスワードを含めることもできます。
  • サーバーとクライアントの両方が接続されている可能性のあるログインを備えたワイヤレスルーターがある場合、そのルーターの内部ページには、関連するIPアドレスが含まれていることがよくあります。ルーターへのログインと画面スクレイピングの実行を実装する必要があります。
于 2012-12-31T12:54:54.620 に答える
2

WLAN のローカル サーバーを使用する Android アプリを作成しました。端末 (電話) に独自の IP アドレスをブロードキャストさせ、それをサーバーが取得しました。

電話で MultiCast クラスを使用しました。これにより、それ自体の IP アドレスがペイロードに追加されました。サーバーには常に、パケットのペイロード (端末の IP アドレス) を取得するマルチキャスト読み取りクラスのスレッドがあります。端末をデータグラム読み取り状態に設定し、サーバーの IP アドレスを端末に送信します。

より良い方法かもしれませんが、ネットワーク内の未知の端末の IP アドレスを取得する優れた方法です。

于 2013-02-14T13:42:08.643 に答える
2

「Tomcat サーバー」または「Tomcat サーバー」を検出しますか?

つまり、サーバーをカスタマイズする方法はありますか? その場合は、Android アプリケーションが検索できる非常に単純なテスト ページ ("Hello" JSP ページなど) をサーバー上に作成できます。

GET リクエストで Android が「Hello」の結果を取得したhttp://<tomcat_ip>/hello.jsp場合は、Tomcat がオンラインであると見なすことができます。

このテスト ページを追加できない場合は、サーバーが提供するはずの任意のページをテストできます。(時には適切に構成されておらず、Tomcat のバージョンを示す 404 ページでさえ...)

于 2012-12-31T12:49:32.440 に答える
0

私がこの問題を解決した方法は、列挙を使用することです。

public String getLocalIpAddress()
{

    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    return inetAddress.getHostAddress().toString();
                }
            }
        }
    } catch (Exception ex) {
    }
    return null;
}
}
于 2013-02-18T06:39:15.787 に答える