2012-12-31 91 views
2

我有一個Android應用程序,它使用本地網絡上的web服務。有一個配置屏幕,用戶通知服務器IP地址,該地址運行Apache Tomcat。如何發現網絡上的Tomcat服務器的IP地址?

我正在尋找一種基於當前連接的Wi-Fi網絡自動檢測服務器的方法。 即:智能手機的IP爲10.1.1.90,服務器IP爲10.1.1.254。

有沒有辦法做到這一點?我正在考慮使用ping,但我不知道這是否是一個好意思。

+1

非常相似:http://stackoverflow.com/questions/9446799/android-search-for-server-automatically – burna

+0

所以,你會在運行此Web服務的Web服務器的IP地址列表? –

+0

基本上,我會在我的網絡中運行Tomcat的服務器的單個IP地址。 – fonini

回答

3

我瞭解它的方式,你需要發現你的tomcat服務器的IP,並使用你的客戶端連接它。

我假設,服務器和客戶端都在您的控制之下。 一個簡單的方法可以使用jGroups集羣。

  • 你可以讓你的tomcat發現
  • 客戶端可以使用您所提供.Refer是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服務器名稱和端口

+0

這正是我需要的。非常感謝! – fonini

2

你想檢測「一個tomcat服務器」或「你的tomcat服務器」嗎?

我的意思是,你有什麼辦法來定製你的服務器?如果是這樣的話,那麼你可以在你的服務器上創建一個非常簡單的測試頁面(比如說一個「Hello」JSP頁面),這是你的Android應用程序可以查找的。

如果你的Android在http://<tomcat_ip>/hello.jsp上獲得GET請求的「Hello」結果,那麼你可能會認爲tomcat在線。

如果您不能添加此測試頁,那麼您可以測試服務器應該服務的任何頁面。 (即使404頁面有時配置不好,並且顯示tomcat版本...)

+0

在我能做到這一點之前,我需要知道服務器使用哪個IP地址。 – fonini

+0

你怎麼能有一個tomcat服務器,而不知道它的IP地址?你應該進一步解釋你的情況,因爲它不清楚。你沒有回答我的問題:「一個tomcat」或「你的tomcat」? –

+0

用戶需要在配置屏幕上輸入服務器的IP地址。用戶很愚蠢。我想要一個「魔法按鈕」來發現託管Web服務的服務器的IP。 – fonini

2

Tomcat響應標頭可以包含xpoweredBy字段,如果啓用,它將宣告Tomcat。但是,由於安全考慮,它最常被禁用,甚至默認情況下禁用。但是,如果您需要自動檢測您的Tomcat服務器,您可以重新啓用它。另一方面,的確,如果你可以在你的服務器上放置一個網頁,你可以簡單地放置一個帶有商定簽名的標記頁面。

如果服務器IP是未知的,我建議通過以下方式來檢測網絡上的服務器:

  • 最直接的方法就是做breadcast平(ping -b broadcast_address其中breadcast地址可以計算here , 例如)。所有配置好的網絡設備都會回覆,然後按照上面解釋的那樣驗證哪一個是服務器。然而,ping廣播地址需要一個根深蒂固的電話。此外,路由器可能不支持。
  • 您的DHCP服務(最有可能是您的路由器)通常可以配置爲始終爲您的服務器網卡的相同MAC地址發出相同的IP地址。
  • 如果服務器是臺式計算機或筆記本電腦,則可以將其地址顯示爲QR碼。智能手機可以從屏幕上掃描代碼,這比通過觸摸屏輸入IP地址更容易。二維碼還可以包含自動生成的密碼以提高安全性。
  • 如果在無線路由器中連接了服務器和客戶端都可能登錄,則該路由器的內部頁面通常會包含相關的IP地址。您需要實現登錄到路由器並做一些屏幕報廢。
+0

我需要知道什麼是服務器IP地址。 – fonini

+0

盡我所能,也許有一個解決方案適合。 – h22

2

我做了一個在WLAN中使用本地服務器的Android應用程序。我讓終端(電話)廣播了它自己的IP地址,然後服務器拿起它。

我在手機上使用了MultiCast類,它將自己的IP地址添加到有效負載中。服務器總是在多播讀取類中擁有一個線程,以保證數據包的有效負載(終端ip地址)。將終端設置爲數據報讀取狀態並將服務器IP地址發送到終端。

也許是更好的方式,但是獲取網絡中未知終端的IP地址的好方法。

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; 
} 
}