import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.ListIterator;
public class PortScanner{
InetAddress address; //目标主机地址
int startPort; //起始端口
int endPort; //终止端口
ArrayList result = new ArrayList(); //结果保存链表
String ip; //目标主机地址(用户输入)
//构造方法(主机地址,起始端口,终止端口,主机地址(用户输入))
public PortScanner(InetAddress address,int startPort,int endPort,String ip){
this.address = address;
this.startPort = startPort;
this.endPort = endPort;
this.ip = ip;
}
//扫描指定端口段方法
public void scan(){
String hostname=new String();
for(int nport=startPort;nport<=endPort;nport++){
try{
System.out.print("Scanning "+nport);
Socket s = new Socket(address,nport); //建立与nport端口的连接
s.close();//关闭连接,避免浪费资源
result.add(""+nport);//添加结果到链表
System.out.println(" : open");
}catch(IOException e){
System.out.println(":close");
}
}
}
//打印扫描结果方法
public void printResult(){
System.out.println("\n扫描结果:\n主机:"+ip+"\t主机名:"+address.getHostName()+"\n");
System.out.println("端口\t状态");
ListIterator li = result.listIterator();
while(li.hasNext()){
System.out.println(li.next().toString()+"\tOpen");
}
}
//程序入口
public static void main(String[] args) {
System.out.println("Java版简单端口扫描工具");
System.out.println("海啸天鸣(Ansty)"+"\n");
System.out.println("用法:");
System.out.println("java JavaScanner 目标地址 起始端口 终止端口\n");
String ip = new String();
int startPort = 0;
int endPort = 0;
InetAddress address;
try{
ip = args[0]; //得到用户输入的目标主机
startPort = Integer.parseInt(args[1]); //得到起始端口
endPort = Integer.parseInt(args[2]); //得到终止端口
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Java版简单端口扫描工具");
System.out.println("海啸天鸣(Ansty)"+"\n");
System.out.println("用法:");
System.out.println("java JavaScanner 目标地址 起始端口 终止端口\n");
return;
}
//判断端口段的合法性
if(startPort<1||startPort>65535||endPort<1||endPort>65535){
System.out.printf("端口范围必须在1~65535以内!");
return;
}else if(startPort>endPort){
System.out.println("端口输入有误!\n起始端口必须小于终止端口");
return;
}
try{
address = InetAddress.getByName(ip);
}catch(UnknownHostException e){
System.out.println("无法找到 "+ ip);
return;
}
//新建PortScanner类
PortScanner ps = new PortScanner(address,startPort,endPort,ip);
ps.scan();//扫描开始
ps.printResult(); //打印扫描结果
}
}