我有一个Android应用程序,它使用本地网络上的Web服务。有一个配置屏幕,用户通知运行Apache Tomcat的服务器IP地址。
我正在寻找一种基于当前连接的Wi-Fi网络自动检测服务器的方法。 即:智能手机的IP为10.1.1.90,服务器IP为10.1.1.254。
有没有办法实现这个目标?我正在考虑使用ping,但我不知道它是否是一个好的意识形态。
答案 0 :(得分:3)
我理解它的方式,您需要发现您的tomcat服务器的IP并使用您的客户端连接它。
我假设,服务器和客户端都在您的控制之下。 一种简单的方法是使用jGroups群集。
我模拟它制作以下服务器类
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 -b broadcast_address
,例如,可以计算面包广播地址here。所有配置的网络设备都会回复,然后如上所述验证哪一个是服务器。但是,ping广播地址需要有根电话。路由器也可能不支持。答案 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;
}
}