我的工作是为零售环境的网络摄像机开发软件。我的团队正在开发的软件之一是网络服务器,它检索相机本身(具有自己的嵌入式网络服务器)以 HTML 生成并存储在相机上的各种报告。然后,我们的软件将从摄像头获取这些报告并将其存储在中央网络服务器上。
虽然我们可以很好地将摄像机的 IP 插入到我们的软件中,但我正在开发一个简单的 Java 类,它将查询网络并定位网络上的所有摄像机。
但问题是,虽然它在我的 PC 和我同事的 PC 上运行得很好,但当我们尝试在将托管我们软件的实际网络服务器 PC 上运行它时......它运行,但表示子网中的每个 IP 都处于脱机状态/ 无法到达网关 IP 除外。
例如,如果我在插入封闭的 LAN 时从我的 PC 或同事的 PC 运行它,我会找到以下活动 IP 以及一个标志,告诉我它是否是摄像头。(网关为192.168.0.1,子网掩码为255.255.255.0,表示要查找的全系列256台设备)
IP:/192.168.0.1 Active:true Camera:false
IP:/192.168.0.100 Active:true Camera:true <- this is camera 1
IP:/192.168.0.101 Active:true Camera:true <- this is camera 2
IP:/192.168.0.103 Active:true Camera:false <- my PC
IP:/192.168.0.104 Active:true Camera:false <- this is our webserver
但由于某种原因,当从网络服务器 PC 运行相同的程序时,使用相同的 JRE,我只得到以下发现
IP:/192.168.0.1 Active:true Camera:false
现在我的代码不是在主线程上按顺序枚举每个 IP,而是为每个要检查的 IP 创建一个单独的线程并同时运行它们(否则枚举整个 IP 范围只需 21 分钟多一点超时 5000 毫秒/IP)。然后主线程每 15 秒一遍又一遍地重新运行这些 IP 扫描线程。
我检查了所有 PC 上的所有线程都运行完成,没有抛出异常。甚至验证没有线程卡住。每个线程从开始到完成大约需要 5001 到 5050 毫秒,而那些具有活动 IP 的线程会更快完成(> 5000 毫秒),所以我知道它在 ipAddr.isReachable(5000) 方法中正确地等待了完整的 5000 毫秒。
我和我的同事在这一点上被难住了,虽然它在我们的 PC 上运行时似乎可以很好地达到那些活动 IP,但没有得到网络服务器 PC 的响应???
我们已经排除了防火墙问题、管理员访问问题等。唯一的区别是我们的网络服务器是 Embedded Win XP,而我们的 PC 是 Windows 7。
这让我们很难过。任何想法为什么?
下面是运行每个 IP 线程的代码:
public void CheckIP() {
new Thread() {
@Override
public void run() {
try {
isActive = ipAddr.isReachable(5000);
if (isActive) {
if (!isCamera) {
isCamera = new IpHttpManager().GetResponse(ipAddr.toString());
}
} else {
isCamera = false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
编辑:这是在根据网关和子网确定范围后构建每个 IP 以进行检查的代码...
for(int i=subMin; i<=subMax; i++) {
byte[] ip = new byte[] {(byte)oct[0],(byte)oct[1],(byte)oct[2],(byte)i};
try {
scanners[subCount] = new IpScan(InetAddress.getByAddress(ip));
subCount++;
} catch (UnknownHostException e) {
e.printStackTrace();
}}