龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java语言深入 多线程程序模型研究

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
多线程是较复杂程序设计过程中不可缺少的一部分。为了提高应用程序运行的性能,采用多线程的设计是一种比较可行的方案。本文通过介绍使用Java编写的扫描计算机端口的实例,来说

      多线程是较复杂程序设计过程中不可缺少的一部分。为了提高应用程序运行的性能,采用多线程的设计是一种比较可行的方案。本文通过介绍使用Java编写的扫描计算机端口的实例,来说明多线程设计中应注重的问题,以及得出经常使用的多线程模型。
  
      本文要求读者具备一定的Java语言基础,对Socket有一定的了解。本文的所有程序在Java SDK 1.4.2编译通过并能正常运行。
  
      现在,我们需要对一台主机扫描其端口,找出哪些端口是open的状态。我们先采用单线程进行处理,程序代码如下:
  -------------------------------------------------------------------------------------------------------
  import java.io.IOException;
  import java.net.Socket;
  import java.net.UnknownHostException;
  
  public class PortScannerSingleThread {
      public static void main(String[] args) {
          String host = null;        //第一个参数,目标主机。
          int beginport = 1;         //第二个参数,开始端口。
          int endport = 65535;       //第三个参数,结束端口。
          try{
              host = args[0];
              beginport = Integer.parseInt(args[1]);
              endport = Integer.parseInt(args[2]);
              if(beginport <= 0  endport >= 65536  beginport > endport){
                  throw new Exception("Port is illegal");
              }
          }catch(Exception e){
              System.out.println("Usage: java PortScannerSingleThread host beginport endport");
              System.exit(0);
          }
          
  
          for (int i = beginport; i <= endport; i++) {
              try {
                  Socket s = new Socket(host, i);
                  System.out.println("The port " + i + " is opened at " + host);
              }catch (UnknownHostException ex) {
                  System.err.println(ex);
                  break;
              }catch (IOException ex) {
              }
          }
      }
  }
  --------------------------------------------------------------------------------------------------------
      在以上程序中,通过java.net.Socket类来识别端口是否是open状态。程序接受3个参数,第一个参数是主机IP,第二和第三个参数是需要扫描的起始和中止的端口号(1~65535)。本程序(java PortScannerSingleThread 10.1.1.1 1 1000)运行结果如下:
  The port 25 is opened at 10.1.1.182
  The port 110 is opened at 10.1.1.182
  The port 135 is opened at 10.1.1.182
  ...
  
      但是,以上程序运行效率实在不敢恭维,把目标主机端口扫描一遍需要十几分钟甚至更长,估计没有哪个用户可以忍受这样的效率。
  
      所以,提高程序处理效率是必须的,下面的程序通过多线程的方法来进行处理。程序代码如下:
  ----------------------------------------------------------------------------------------------------------
  import java.io.IOException;
  import java.net.Socket;
  import java.net.UnknownHostException;
  
  public class PortScannerMultiThread {
      public static void main(String[] args) {
          String host = null;
          int beginport = 1;
          int endport = 65535;
          try{
              host = args[0];
              beginport = Integer.parseInt(args[1]);
              endport = Integer.parseInt(args[2]);
              if(beginport <= 0  endport >= 65536  beginport > endport){
                  throw new Exception("Port is illegal");
              }
          }catch(Exception e){
              System.out.println("Usage: java PortScannerSingleThread host beginport endport");
              System.exit(0);
          }
          
  
          for (int i = beginport; i <= endport; i++) {
              PortProcessor pp = new PortProcessor(host,i);      //一个端口创建一个线程
              pp.start();
          }
      }
  }
  
  class PortProcessor extends Thread{
      String host;
      int port;
      
      PortProcessor(String host, int port){
          this.host = host;
          this.port = port;
      }
      
      public void run(){
          try{
              Socket s = new Socket(host,port);
              System.out.println("The port " + port + " is opened at " + host);
          }catch(UnknownHostException ex){
              System.err.println(ex);
          }catch(IOException ioe){
          }
      }
  }
  

QQRead.com 推出数据恢复指南教程 数据恢复指南教程 数据恢复故障解析 常用数据恢复方案 硬盘数据恢复教程 数据保护方法 数据恢复软件 专业数据恢复服务指南

  
  

精彩图集

赞助商链接