频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源: 作者: 出处:巧巧读书 2006-10-27 进入讨论组
下一页 1 2 3 4 

    多线程是较复杂程序设计过程中不可缺少的一部分。为了提高应用程序运行的性能,采用多线程的设计是一种比较可行的方案。本文通过介绍使用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){
        }
    }
}

保留:: http://www.qqread.com/java/2006/10/w255460.html 更多文章 更多内容请看Java环境安装配置Java编程开发手册Java线程专题,或进入讨论组讨论。
下一页 1 2 3 4 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章