2010-04-26 80 views
2

假设我运行了几台在本地网络上提供基本请求的服务器(比如说一个家庭网络,所有机器通常都有一个IP,形式为K.K.K.x,其中x是可变的)。有没有简单的方法来发现所有这些服务器?我需要在运行特定Java服务器应用程序的网络上查找每个IP。如何发现本地网络上的Web服务器?

回答

2

让您拥有一个C类网络...只是尝试打开1和254之间的每个IP地址的特定服务器应用程序的端口如果你想获得幻想,你可以做一些检查,以验证该端口实际上是打开的,它可以满足你对该应用程序的期望。

+0

我并不太热衷于网络。我可以运行1-254,但是如何以跨平台的方式获取IP地址的前3个字节?我的直觉说,有一些工具,如ipconfig/ifconfig,有适当的参数,将返回本地IPV4地址(这将给我我需要的字节),但我想知道是否有更多的java-ish方式。 – 2010-04-27 01:50:43

+0

杜。我只是搜索“获取IP地址Java”。这应该很好。 – 2010-04-27 02:06:10

1

因为不是每个Web服务器的80固定端口上侦听,您需要扫描端口。在每个端口上打开(并关闭!)一个套接字,您可以使用java.net.Socket。如果成功,然后在有关IP /端口上的/上发起一个简单的GET请求,则可以使用java.net.URLConnection。如果您收到有效的HTTP响应(不管状态码如何),那么它是一个网络服务器。您可以通过HTTP响应中的Server头来确定服务器类型。但是,您需要考虑到服务器管理员可能会欺骗/删除/更改默认响应标头。

注意,一些防火墙可以识别端口扫描器的扫描图案并阻止此。

0

我会scan IP range和测试插座连接到端口80,这样的代码:

try { 
     s = new Socket(addr,80); 
     System.out.println("Webserver found on IP:" + addr); 
     s.close(); 
    } 
catch (IOException ex) { 
     System.out.println("Webserver NOT found on IP:" + addr); 
    } 
+1

不要忘记's.close()'。 – jweyrich 2010-04-26 23:56:45

4

您是否正在寻找您的Java应用程序中的解决方案?如果您只是在寻找一次性解决方案,nmap应该可以工作。

如果你的本地网络的形式为192 * * *试试这个(我加了sudo的,因为它必须以root身份运行)。

sudo nmap -vv -sS -O -n "192.168.1.1/24" 
+0

+1 - 快速且非常强大。 – 2010-04-26 23:06:55

+1

需要root用户,因为您提供的选项执行SYN扫描,这依赖于RAW套接字,并且只能由超级用户创建。 – jweyrich 2010-04-26 23:07:21

1

有两种基本的方法来实现这一点,并且都要求您向要检查的每个主机发送/接收数据包。

  • 最简单的方法是试图建立TCP连接所需的端口,如你通常做。

  • 一个更复杂的和花式的方法,但在执行方面更快,正在发送一个SYN分组,并且等待一个响应分组。如果响应是SYN/ACK,则表示端口已打开(等待连接),否则不是。但是,Java没有为此提供必要的API(请参阅raw socket)。你必须找到一个库/包装器或使用C和JNI编写一个库。

更多的见解,第二个选项,阅读this

+0

这样做需要能够推送原始数据包,通常A)不能从Java执行,B)不可取,因为发送原始数据包需要额外的系统特权。如果人们没有以管理员身份运行Windows,那么恶意软件感染的情况就会少得多。 – 2010-04-26 23:27:26

+0

@Devon是正确的,我正在更新我的答案,提到Java没有必要的API。 Microsoft删除了对XP-SP2上原始套接字创建的支持,但您仍然可以创建/发送以太网帧。 – jweyrich 2010-04-26 23:42:18