我有一個Android應用程序,它使用本地網絡上的web服務。有一個配置屏幕,用戶通知服務器IP地址,該地址運行Apache Tomcat。如何發現網絡上的Tomcat服務器的IP地址?
我正在尋找一種基於當前連接的Wi-Fi網絡自動檢測服務器的方法。 即:智能手機的IP爲10.1.1.90,服務器IP爲10.1.1.254。
有沒有辦法做到這一點?我正在考慮使用ping,但我不知道這是否是一個好意思。
我有一個Android應用程序,它使用本地網絡上的web服務。有一個配置屏幕,用戶通知服務器IP地址,該地址運行Apache Tomcat。如何發現網絡上的Tomcat服務器的IP地址?
我正在尋找一種基於當前連接的Wi-Fi網絡自動檢測服務器的方法。 即:智能手機的IP爲10.1.1.90,服務器IP爲10.1.1.254。
有沒有辦法做到這一點?我正在考慮使用ping,但我不知道這是否是一個好意思。
我瞭解它的方式,你需要發現你的tomcat服務器的IP,並使用你的客戶端連接它。
我假設,服務器和客戶端都在您的控制之下。 一個簡單的方法可以使用jGroups集羣。
我模擬它做以下服務器類
的 JChannel API集羣的名稱發現它public class TomcatServer {
JChannel channel;
private void start() throws Exception {
channel = new JChannel(); // use the default config, udp.xml
channel.connect("TomcatCluster");
}
public static void main(String[] args) throws Exception {
new TomcatServer().start();
}
}
模擬客戶端類
public class MobileApp extends ReceiverAdapter {
JChannel channel;
private void start() throws Exception {
channel = new JChannel(); // use the default config, udp.xml
channel.setReceiver(this);
channel.connect("TomcatCluster");
channel.close();
}
public static void main(String args[]) throws Exception {
new MobileApp().start();
}
客戶端將提供以下信息
GMS:地址= MACHINENAME-47879,簇= TomcatCluster,物理地址= XXXXX:0:XXX:XXXX:XXXX:XXXX:XXX:XXXX:XXXX
**視圖:[MACHINENAME-31239 | 1] [MACHINENAME-31239,MACHINENAME-47879]
凡MACHINENAME-47879是在客戶機和端口& MACHINENAME-31239是Tomcat服務器名稱和端口
這正是我需要的。非常感謝! – fonini
你想檢測「一個tomcat服務器」或「你的tomcat服務器」嗎?
我的意思是,你有什麼辦法來定製你的服務器?如果是這樣的話,那麼你可以在你的服務器上創建一個非常簡單的測試頁面(比如說一個「Hello」JSP頁面),這是你的Android應用程序可以查找的。
如果你的Android在http://<tomcat_ip>/hello.jsp
上獲得GET請求的「Hello」結果,那麼你可能會認爲tomcat在線。
如果您不能添加此測試頁,那麼您可以測試服務器應該服務的任何頁面。 (即使404頁面有時配置不好,並且顯示tomcat版本...)
Tomcat響應標頭可以包含xpoweredBy字段,如果啓用,它將宣告Tomcat。但是,由於安全考慮,它最常被禁用,甚至默認情況下禁用。但是,如果您需要自動檢測您的Tomcat服務器,您可以重新啓用它。另一方面,的確,如果你可以在你的服務器上放置一個網頁,你可以簡單地放置一個帶有商定簽名的標記頁面。
如果服務器IP是未知的,我建議通過以下方式來檢測網絡上的服務器:
ping -b broadcast_address
其中breadcast地址可以計算here , 例如)。所有配置好的網絡設備都會回覆,然後按照上面解釋的那樣驗證哪一個是服務器。然而,ping廣播地址需要一個根深蒂固的電話。此外,路由器可能不支持。我做了一個在WLAN中使用本地服務器的Android應用程序。我讓終端(電話)廣播了它自己的IP地址,然後服務器拿起它。
我在手機上使用了MultiCast類,它將自己的IP地址添加到有效負載中。服務器總是在多播讀取類中擁有一個線程,以保證數據包的有效負載(終端ip地址)。將終端設置爲數據報讀取狀態並將服務器IP地址發送到終端。
也許是更好的方式,但是獲取網絡中未知終端的IP地址的好方法。
我解決的方式這個問題與枚舉的使用有關。
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;
}
}
非常相似:http://stackoverflow.com/questions/9446799/android-search-for-server-automatically – burna
所以,你會在運行此Web服務的Web服務器的IP地址列表? –
基本上,我會在我的網絡中運行Tomcat的服務器的單個IP地址。 – fonini