Java扫描局域网地址主要通过CMD命令,主要通过Runtime和Process类,由于同一局域网下的IP地址比较多需要通过Java的多线程来扫描端口。
import java.io.BufferedInputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import .InetAddress;import java.util.regex.Matcher;import java.util.regex.Pattern;public class PingTask{private String address;public PingTask(String address){this.address=address;}public PingResult run() {Runtime runtime;Process process;try {runtime=Runtime.getRuntime();process=runtime.exec("ping "+address);BufferedInputStream inputStream=(BufferedInputStream) process.getInputStream();byte [] bt =new byte[1024];StringBuffer buffer=new StringBuffer();int len=0;while((len=inputStream.read(bt, 0,bt.length))!=-1){buffer.append(new String(bt, 0, len, "GBK"));}String regex="(\\d*)?";String result="";Pattern pattern=pile(regex);Matcher matcher=pattern.matcher(buffer.toString());while(matcher.find()){if(!matcher.group().equals("")){result=matcher.group();}}InetAddress inetAddress=InetAddress.getByName(address);String hostname="";if(!inetAddress.getHostName().equals(address)){hostname=inetAddress.getHostName();}String mac="";process=runtime.exec("arp -a "+address);BufferedInputStream macinputStream=(BufferedInputStream) process.getInputStream();byte [] macbt =new byte[1024];StringBuffer macbuffer=new StringBuffer();while((len=macinputStream.read(macbt, 0,macbt.length))!=-1){macbuffer.append(new String(macbt, 0, len, "GBK"));}String[] macresult=macbuffer.toString().trim().split("\r\n");if(!macbuffer.toString().contains("未找到 ARP")){mac=macresult[2].substring(20, 40).trim();}PingResult pingResult=new PingResult(address,(100-Integer.parseInt(result))+"%",mac,hostname);} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return pingResult;}}
调用方法:
public static void main(String[] args) {PingResult result=new PingTask("123.123.123.123");System.out.println(result.toString());}
PingResult 类
package com.xu.ip;public class PingResult {private static String address;//IP地址private static String result;//是否可以连接private static String physicialaddress;//物理地址private static String hostname;//主机名public String getPhysicialaddress() {return physicialaddress;}public void setPhysicialaddress(String physicialaddress) {PingResult.physicialaddress = physicialaddress;}public String getHostname() {return hostname;}public void setHostname(String hostname) {PingResult.hostname = hostname;}public PingResult(String address, String result) {PingResult.address = address;PingResult.result = result;}public PingResult() {}public PingResult(String address, String result, String physicialaddress, String hostname) {PingResult.address = address;PingResult.result = result;PingResult.physicialaddress = physicialaddress;PingResult.hostname = hostname;}public String getAddress() {return address;}public void setAddress(String address) {PingResult.address = address;}public String getResult() {return result;}public void setResult(String result) {PingResult.result = result;}@Overridepublic String toString() {return "PingResult [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()="+ super.toString() + "]";}}