计算机网络课程课程设计任务书计算机网络设计说明书学院名称:计算机与信息工程学院班级名称:网络工程122班学生姓名:学号:题目:基于多线程的端口扫描程序指导教师姓名:起止日期:2015年6月13日至2015年6月20日一、选题背景随着互联网的飞速发展,网络入侵行为日益严重,网络安全成为人们关注的焦点。
端口扫描技术是网络安全扫描技术的重要技术之一。
对目标系统进行端口扫描,是网络系统入侵者进入目标系统的第一步。
网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。
网络安全探测的所有功能都是建立在端口扫描的基础上,所以对端口扫描技术的研究有着非常重要的现实意义。
现实世界中的很多过程都具有多条线索同时动作的特性。
Java语言的一大特性就是内置对多线程的支持。
多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。
端口是由计算机的通信协议TCP/IP协议定义的。
其中规定,有IP地址和端口号作为套接字,它代表TCP连接的一个连接端,一般称为Socket。
具体来说,就是用[IP:端口]来定位一台主机的进程。
可见端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。
由此可见,通过扫描端口,就可以判断出目标计算机有哪些通信进程正在等待连接。
利用TCP connect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接,如果目标主机该端口有回复,则说明该端口开放。
利用多线程技术实现了对一目标IP进行设定数目的端口扫描,对多IP段的特定端口进行扫描。
二、方案设计多线程端口扫描器是实现计算机的端口的扫描,只要在在前台设置好所要扫描的IP、起始端口、结束端口以及所要用到的线程数,点击扫描,就可以扫描到所输入IP地址主机的开放端口,并显示在主窗体中;点击退出,则可以退出该程序。
IP设置应为所在主机的IP地址,起始端口和结束端口应为0~65535之间的一个数,且起始端口应小于结束端口的大小。
线程数为0~200之间的一个数。
点击开始后就会运行,直到扫描完毕显示出开放端口,如果没有开放端口,则只显示扫描完毕。
本系统要实现的功能:①端口扫描功能:扫描开放的端口,并将扫描到的开放端口号送到前台。
②图像显示功能:显示图形界面,以及显示扫描结果。
③多线程功能:当客户端要求与服务器端建立连接时,服务器端就将用到多线程功能,为每一个建立起来的连接创建一个线程。
④异常抛出功能:对于明显的数据错误,能提示出错误的类型并阻止程序的运行。
流程图:三、详细设计本程序是由3 模块组成的:图形界面,按钮的监听及数据检验,端口扫描(1)图形用户界面是软件产品和用户交互的接口,是软件产品中用户直接可以看到并直接操作的部分。
public static JFrame main=new JFrame("基于JAVA的多线程TCP端口扫描程序\\李梦然");public static JTextArea Result=new JTextArea("",4,44);public static JTextField hostname=new JTextField("localhost",8);public static JTextField minPort=new JTextField("0",4);public static JTextField maxPort=new JTextField("1000",4);public static JTextField maxThread=new JTextField("100",3);public static JDialog DLGError=new JDialog(main,"错误!");public static Label DLGINFO=new Label("");public static Label status=new Label("扫描状态:未开始");public Scanner(){main.setSize(500,220);main.setLocation(350,300);main.setResizable(false);DLGError.setSize(300,100);DLGError.setLocation(450,400);Result.setBackground(Color.pink);JPanel mainPanel = new JPanel();Label H=new Label("ip:");Label P1=new Label("端口范围:");Label P2=new Label("—");Label TNUM=new Label("线程数:");Label RST=new Label("扫描结果: ");Result.setLineWrap(true);Result.setEditable(false);JButton OK = new JButton("确定");JButton Submit = new JButton("确定");JButton Cancel = new JButton("取消");Container mPanel = main.getContentPane();Container dPanel = DLGError.getContentPane();mPanel.setLayout(new FlowLayout(FlowLayout.LEFT));dPanel.setLayout(new FlowLayout(FlowLayout.CENTER));mPanel.add(H);mPanel.add(hostname);mPanel.add(P1);mPanel.add(minPort);mPanel.add(P2);mPanel.add(maxPort);mPanel.add(TNUM);mPanel.add(maxThread);mPanel.add(RST);mPanel.add(Result);mPanel.add(status);mPanel.add(Submit);mPanel.add(Cancel);dPanel.add(DLGINFO);dPanel.add(OK);main.setVisible(true);Submit.addActionListener(new SubmitAction());Cancel.addActionListener(new CancleAction());OK.addActionListener(new OKAction());(2)按钮监听是整个程序的时间驱动设计部分。
并且显示运行结果。
数据处理是对用户输入的数据进行检验是否错误,来进行报错处理。
class CancleAction implements ActionListener{public void actionPerformed (ActionEvent e){System.exit(1);}}class SubmitAction implements ActionListener{public void actionPerformed (ActionEvent a){int min;int max;int num;try{min=Integer.parseInt(Scanner.minPort.getText());max=Integer.parseInt(Scanner.maxPort.getText());num=Integer.parseInt(Scanner.maxThread.getText());}catch(NumberFormatException e){Scanner.DLGINFO.setText("错误的端口号或线程数!端口号和线程数必须为整数!");Scanner.DLGError.setVisible(true);Scanner.status.setText("扫描状态:未开始");return;}try{Saomiao.hostAddress=InetAddress.getByName(Scanner.hostname.getText());}catch(UnknownHostException e){Scanner.DLGINFO.setText(" 错误的IP地址/域名或地址不可达! ");Scanner.DLGError.setVisible(true);Scanner.status.setText("扫描状态:未开始");return;}if(min<0 || min>65535 || min>max){Scanner.DLGINFO.setText("最小端口必须是0-65535并且小于最大端口的整数!");Scanner.DLGError.setVisible(true);return;}elseSaomiao.minport=min;if(max<0 || max>65535 || max<min){Scanner.DLGINFO.setText("最大端口必须是0-65535并且大于最小端口的整数!");Scanner.DLGError.setVisible(true);Scanner.status.setText("扫描状态:未开始");return;}elseSaomiao.maxport=max;if(num<1 || num>200){Scanner.DLGINFO.setText(" 线程数为1-200的整数! ");Scanner.DLGError.setVisible(true);Scanner.status.setText("扫描状态:未开始");return;}Scanner.Result.setText("");Scanner.Result.append("正在扫描"+Scanner.hostname.getText()+" 线程数"+Scanner.maxThread.getText()+"\n");Scanner.Result.append("开放端口: ");for(int i=0;i<num;i++){new Saomiao(i).start();}}}class OKAction implements ActionListener{public void actionPerformed (ActionEvent e){Scanner.DLGError.dispose();}}(3)端口扫描程序主要运用Socket编程。