1、我们咸犴孜稍先来看一下我们的获取一定网段内存活的主机的方式,我们采用的主要的方法,就是InetAddress.getByName,这个是java的类提供给菀蒯踔观我们的接口,我们需要通过getbyname方法进行Inetaddress的构建,然后通过isreachable的方法来判断这个主机是否存活,我们采用的还是一个逐个枚举来分析的方法。当然我知道有些人会提到arp -a命令,我要说的是arp这个不是对所有类型的主机都可以生效的,java的Inetaddress会更加靠谱一些。
2、然而我也只用到了inetaddress的检索ip的功能,以下就是我在10.45.34.X网段上检索出的所有存活主机的ip,经过试验,我发现java的1.7jdk版本是无法实现这个功能的,只有1.8可以,应该是1.7的部分调用被屏蔽了。inetaddress包含了ping的内容,但是比ping多一个tcp校验。
3、但是这个类还是有部分不周到的地方的,主机名的获取问题很大,经常还是会返回给我一稍僚敉视个ip地址,当然这也可能是因为目标主机防火墙on导致的主机名无法获取的情况,但是有些ping的时候也是可以pin通的,这个就很尴尬。所以我们在获取完ip地址之后,还需要通过一个cmd的ping命令才能获取到其他的信息。下图为我们的cmdping的情况:
4、下面我们就来写一个根据已经存活的主机的IP地址我们的对象主机的代码,这一段代码其实很简单,只是通过cmd的调用来完成,我们需要一些字符串的操作,把我们的TTL的值和我们的主机名获取出来就可以了,代码如下。
5、现在原则上来说我们的代码就已经可以运行了,但是我们需要注意的是,无论是Inetaddress的方法,还是ping的方法,单个运行的效率其实是很低下的,我们这个时候就需要使用到java的多线程方法,而且这个是一个非常明显的生产者-消费者模型,所以我们就大致构建一下,结构如下:
6、这样我们就成功的写好了这么一个程序,对了,再提一句,TTL使我们判断操作系统的标准,但是TTL只能提供这个系统是windows、unix还是linux的简单判断,需要更深入的篦赐尜僳朋友请多了解一下TCP的接口通讯,这会比较复杂而且略微的属于黑客范畴,我就不在这里提到了,以下就是我们程序的运行结果:是不是很简单呢?有时候看上去困难的问题,尝试下,也就不再是困难了,想做个好的程序员,真的很轻松。