WEB开发网
开发学院WEB开发Jsp Java语言深入 多线程程序模型研究 阅读

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

 2008-01-05 19:08:11 来源:WEB开发网   
核心提示:多线程是较复杂程序设计过程中不可缺少的一部分,为了提高应用程序运行的性能,Java语言深入 多线程程序模型研究,采用多线程的设计是一种比较可行的方案,本文通过介绍使用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 推出数据恢复指南教程 数据恢复指南教程 数据恢复故障解析 常用数据恢复方案 硬盘数据恢复教程 数据保护方法 数据恢复软件 专业数据恢复服务指南


Tags:Java 深入

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接