如何发现网络上Tomcat服务器的IP地址?

时间:2012-12-31 12:39:56

标签: java tomcat networking

我有一个Android应用程序,它使用本地网络上的Web服务。有一个配置屏幕,用户通知运行Apache Tomcat的服务器IP地址。

我正在寻找一种基于当前连接的Wi-Fi网络自动检测服务器的方法。 即:智能手机的IP为10.1.1.90,服务器IP为10.1.1.254。

有没有办法实现这个目标?我正在考虑使用ping,但我不知道它是否是一个好的意识形态。

5 个答案:

答案 0 :(得分:3)

我理解它的方式,您需要发现您的tomcat服务器的IP并使用您的客户端连接它。

我假设,服务器和客户端都在您的控制之下。 一种简单的方法是使用jGroups群集。

  • 你可以让你的tomcat被发现
  • 客户端可以使用您提供的群集名称发现它。请参阅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,cluster = TomcatCluster,物理地址= xxxxx:0:xxx:xxxx:xxxx:xxxx:xxx:xxxx:xxxx

**查看:[MACHINENAME-31239 | 1] [MACHINENAME-31239,MACHINENAME-47879]

其中MACHINENAME-47879是客户端机器和端口& MACHINENAME-31239是tomcat服务器名称和端口

答案 1 :(得分:2)

您想检测“tomcat服务器”还是“您的tomcat服务器”?

我的意思是,您有什么方法可以自定义您的服务器吗?如果是这种情况,那么您可以在服务器上创建一个非常简单的测试页面(比如“Hello”JSP页面),Android应用程序可以查找该页面。

如果您的Android在http://<tomcat_ip>/hello.jsp上收到GET请求的“Hello”结果,那么您可能会认为tomcat已联机。

如果您无法添加此测试页,则可以测试服务器应该提供的任何页面。 (即使是有时配置不好的404页面,也显示了tomcat版本......)

答案 2 :(得分:2)

Tomcat响应标头可以包含xpoweredBy字段,如果启用则会通告Tomcat。但是,由于安全考虑,最常禁用它,甚至默认情况下禁用。但是,如果需要自动检测Tomcat服务器,则可以重新启用它。实际上,从另一方面来说,如果您可以在服务器上放置一个网页,您只需放置一个带有约定签名的标记页面。

如果服务器IP未知,我建议采用以下方法检测网络上的服务器:

  • 最直接的方法是进行面包广播ping(ping -b broadcast_address,例如,可以计算面包广播地址here。所有配置的网络设备都会回复,然后如上所述验证哪一个是服务器。但是,ping广播地址需要有根电话。路由器也可能不支持。
  • 您的DHCP服务(很可能是您的路由器)通常可以配置为始终为服务器网卡的相同MAC地址发出相同的IP地址。
  • 如果服务器是台式计算机或笔记本电脑,它可能会将其地址显示为显示的QR码。智能手机可以从屏幕扫描代码,这比通过触摸屏输入IP地址更容易。 QR码还可以包含自动生成的密码,以提高安全性。
  • 如果存在可能登录的无线路由器,其中服务器和客户端都已连接,则该路由器的内部页面通常包含相关的IP地址。您需要实现登录路由器并进行屏幕报废。

答案 3 :(得分:2)

我制作了一个在WLAN中使用本地服务器的Android应用程序。我让终端(电话)广播它自己的IP地址,然后服务器接收。

我在手机上使用了MultiCast类,它将自身的ip-address添加到有效负载中。服务器总是在多播读取类中有一个线程,它获得数据包的有效负载(即终端ip-address)。将终端设置为数据报读取状态,并将服务器ip-address发送给终端。

也许是更好的方法,但是获取网络中未知终端的IP地址的好方法。

答案 4 :(得分: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;
}
}