简单端口扫描器java的设计与实现
IPScan类的实现
package scan.pratice;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.ListIterator;
public class IPScan {
static long startTime=System.currentTimeMillis(); //获取开始时间 public static void main(String[] args) {
if(args.length !=2){
System.out.println("参数不对");
}
int startIP = Integer.parseInt(args[0]);
//获得起始IP,因为args[]是String类型,所以要强制转换成int类型 int endIP = Integer.parseInt(args[1]);
//获得终止IP,同上
ArrayList result = new ArrayList<String>();
//ip地址扫描
for(int id=startIP;id<=endIP;id++){
String addres= "10.28.23.";
try {
Socket s=new Socket(addres+id,8000); //建立连接 } catch (UnknownHostException e ) {
}catch(Exception e){
//System.out.println(e.toString());
if(e.toString().endsWith("java.net.ConnectException: Connection timed out: connect")){
System.out.println(addres+id+":not exist."); }else{
}
} System.out.println(addres+id+":exist."); } } } ListIterator li = result.listIterator(); //获得ArrayList的ListIterator while(li.hasNext()){ //如果li里面有元素 System.out.println(li.next().toString()); //打印出指向的元素,同时将指向下一个元素 } long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
PortScan类的实现
package scan.pratice;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.ListIterator;
public class PortScan {
static long startTime=System.currentTimeMillis(); //获取开始时间 public static void main(String[] args) {
if(args.length !=3){
System.out.println("参数不对");
}
String ip = args[0]; //获得我们指定的服务器地址
int startPort = Integer.parseInt(args[1]);
//获得起始端口号,因为args[]是String类型,所以要强制转换成int类型 int endPort = Integer.parseInt(args[2]);
//获得终止端口号,同上
if(startPort<1||startPort>65535||endPort<1||endPort>65535){
//检查端口是否在合法范围1~65535
System.out.printf("端口范围必须在1~65535以内!");
return;
}else if(startPort>endPort){ //比较起始端口和终止端口
System.out.println("端口输入有误! 起始端口必须小于终止端口"); return;
}
InetAddress address;
try{
address = InetAddress.getByName(ip);
//转换类型
}catch(UnknownHostException e){
System.out.println("无法找到 "+ ip);
return;
}
ArrayList result = new ArrayList<String>();
//端口扫描
for(int nport=startPort;nport<=endPort;nport++){
String typeport="";
switch( nport ){//其实这儿可以不用switch,直接用个hash表记录就可以 case 21:
typeport = "(FTP)";
break;
case 23:
typeport = "(TELNET)";
break;
case 25:
typeport = "(SMTP)";
break;
case 80:
typeport = "(HTTP)";
break;
case 110:
typeport = "(POP)";
break;
case 139:
typeport = "(netBIOS)";
break;
case 1433:
typeport = "(SQL Server)";
break;
case 3389:
typeport = "(Terminal Service)";
break;
case 443:
typeport = "(HTTPS)";
break;
case 1521:
typeport = "(Oracle)";
break;
}
//从起始端口到终止端口进行循环
try{
//System.out.print("Scanning "+nport); //打印扫描进度
System.out.println(ip + ":"+nport);
Socket s=new Socket(address,nport); //建立连接
//关闭连接
if(s.isConnected()){
result.add("端口号:"+nport+typeport+" open"); }
s.close();
//将打开的端口添加到ArrayList result里面
//System.out.println(" : open"); //打印状态
}catch(IOException e){
System.out.println(e.toString());
//System.out.println(":close"); //打印状态
result.add("端口号:"+nport+typeport+" close"); }
}
ListIterator li = result.listIterator();
//获得ArrayList的ListIterator
while(li.hasNext()){ //如果li里面有元素
System.out.println(li.next().toString());
//打印出指向的元素,同时将指向下一个元素
}
long endTime=System.currentTimeMillis(); //获取结束时间
}
} System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
TCPConnect类的实现
package scan.pratice;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.ListIterator;
public class TCPConnect {
static long startTime=System.currentTimeMillis(); //获取开始时间
public static void main(String[] args) {
if(args.length !=3){
System.out.println("参数不对");
}
String ip = args[0]; //获得我们指定的服务器地址
int startPort = Integer.parseInt(args[1]);
//获得起始端口号,因为args[]是String类型,所以要强制转换成int类型 int endPort = Integer.parseInt(args[2]);
//获得终止端口号,同上
if(startPort<1||startPort>65535||endPort<1||endPort>65535){
//检查端口是否在合法范围1~65535
System.out.printf("端口范围必须在1~65535以内!");
return;
}else if(startPort>endPort){ //比较起始端口和终止端口
System.out.println("端口输入有误! 起始端口必须小于终止端口"); return;
}
InetAddress address;
try{
address = InetAddress.getByName(ip);
//转换类型
}catch(UnknownHostException e){
System.out.println("无法找到 "+ ip);
return;
}
ArrayList result = new ArrayList<String>();
/*
//端口扫描
for(int nport=startPort;nport<=endPort;nport++){
String typeport="";
switch( nport ){//其实这儿可以不用switch,直接用个hash表记录就可以 case 21:
typeport = "(FTP)";
break;
case 23:
typeport = "(TELNET)";
break;
case 25:
typeport = "(SMTP)";
break;
case 80:
typeport = "(HTTP)";
break;
case 110:
typeport = "(POP)";
break;
case 139:
typeport = "(netBIOS)";
break;
case 1433:
typeport = "(SQL Server)";
break;
case 3389:
typeport = "(Terminal Service)";
break;
case 443:
typeport = "(HTTPS)";
break;
case 1521:
typeport = "(Oracle)";
break;
}
//从起始端口到终止端口进行循环
try{
//System.out.print("Scanning "+nport); //打印扫描进度
System.out.println(ip + ":"+nport);
Socket s=new Socket(address,nport); //建立连接
//关闭连接
if(s.isConnected()){
result.add("端口号:"+nport+typeport+" open");
}
s.close();
//将打开的端口添加到ArrayList result里面
//System.out.println(" : open"); //打印状态
}catch(IOException e){
System.out.println(e.toString());
//System.out.println(":close"); //打印状态
result.add("端口号:"+nport+typeport+" close");
}
}*/
//ip地址扫描
for(int id=178;id<183;id++){
String addres= "10.28.23.";
try {
Socket s=new Socket(addres+id,8000); //建立连接
} catch (UnknownHostException e ) {
}catch(Exception e){
//System.out.println(e.toString());
if(e.toString().endsWith("java.net.ConnectException: Connection timed out: connect")){
System.out.println(addres+id+":not exist.");
}else{
System.out.println(addres+id+":exist.");
}
}
} ListIterator li = result.listIterator(); //获得ArrayList的ListIterator while(li.hasNext()){ //如果li里面有元素 System.out.println(li.next().toString()); //打印出指向的元素,同时将指向下一个元素 } long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:
}
}
"+(endTime-startTime)+"ms");