利用Java线程池技术实现TCP端口扫描

一个简单的利用线程池技术实现端口扫描(TCP)的小程序:

关键代码如下:

// 扫描本机
private void getLocal()
{
  String ip = getIP();
  String portStart = txPortStart1.getText().trim();
  String portEnd = txPortEnd1.getText().trim();
 
  if (portStart.length() == 0 || portEnd.length() == 0)
  return;
 
  int s = 0;
  int e = 0;
 
  try {
  s = Integer.valueOf(portStart);
  e = Integer.valueOf(portEnd);
  } catch (Exception ex) {
  JOptionPane.showMessageDialog(null, "端口输入有误");
  return;
  }
 
  // 检查端口是否超出范围
  if (! (checkPort(s) && checkPort(e)))
  {
  JOptionPane.showMessageDialog(null, "端口应该大于0而小于65535");
  return;
  }
 
  
  scann(ip, s, e);
 
  runThread(); // 启动线程, 监视扫描是否已完成
}
private String getIP()
{
  try {
  InetAddress addr = InetAddress.getLocalHost();
    return addr.getHostAddress().toString(); // ip
  }
  catch (Exception e)
  {
  JOptionPane.showMessageDialog(null, "获取IP出错!");
  }
  return null;
}
// 扫描单个IP
private void scann(String ip, int startPort, int endPort)
{
  // 将所有按钮设为不可用
  setBtnEdit(false);
  status.setText("请稍候...");
  String[] add = {ip, ""};
  table.addRow(add);
  exec = Executors.newFixedThreadPool(10);
  for (int i = startPort; i <= endPort; i++)
  exec.execute(new RunSocket(ip, i));
  exec.shutdown();
  
}

时间: 2024-09-17 04:12:33

利用Java线程池技术实现TCP端口扫描的相关文章

[并发]线程池技术小白

1  线程池技术介绍 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同样符合这一思想.

Java 线程池的原理与实现

这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用法.关于我对同步的认识,要缘于大三年的一本书,书名好像是 Java 实战,这本书写得实在太妙了,真正的从理论到实践,从截图分析到.class字节码分析

几种java线程池的实现算法分析

1. 前言 本文发表与infoq,因版权属于个人顾再此转载. 在阅读研究线程池的源码以前,只知道如何使用,不了解其内部实现的具体细节,一直感觉是非常高深的技术,研究后才发现,线程池的实现是如此精巧.本文从技术角度分析了线程池的本质原理和组成,同时分析了JDK.Jetty6.Jetty8.Tomcat的源码实现,对于想了解线程池本质.更好的使用线程池或者定制实现自己的线程池的业务场景具有一定指导意义. 2. 使用线程池的意义 l 复用:类似WEB服务器等系统,长期来看内部需要使用大量的线程处理请求

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池.下面我们分别介绍一下这三个类. Java线程池ExecutorService继承树: 一.ThreadPoolExecutor ThreadPoolExecutor是Exe

Java线程池管理及分布式Hadoop调度框架搭建

多线程是程序员面试时常常会面对的问题,对多线程概念的掌握和理解水平,也常常被用来衡量一个人的编程实力.不错,普通的多线程已经不容易了,那么当多线程碰到"大象"又会产生什么样的火花?这里我们为大家分享上海创行科技技术总监严澜的博文--Java线程池管理及分布式Hadoop调度框架搭建. 平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发工程师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式框架

java 线程池中如何自定义每个线程名称

问题描述 java 线程池中如何自定义每个线程名称 **java 线程池中如何自定义每个线程名称 java 线程池中如何自定义每个线程名称 ** 解决方案 补充下,线程池的创建线程池对象时,有一个参数是ThreadFactory类型,如果不传递,默认用的是DefaultFactory,我们可以自定义一个ThreadFactory然后作为参数传到进去,这个类里面就可以自定义线程池中创建的线程的名称.api: public ThreadPoolExecutor(int corePoolSize,in

Java线程池的几种实现方法和区别介绍_java

Java线程池的几种实现方法和区别介绍 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.E

java线程池简单实例

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.但如果对多线程应用不当,会增加对单个任务的处理时间.可以举一个简单的例子: 假设在一台服务器完成一项任务的时间为T       T1 创建线程的时间        T2 在线程中执行任务的时间,包括线程间同步所需时间        T3 线程销毁的时间   显然T = T1+T2+T3.注意这是一个极度简化的假设. 可以看出T1,T3是多线程本身的带来的开销,我们渴望减少T1,T3所用

Java线程池如何体现自己的用途

Java线程池就像数据库连接池一样,是一个对象池.我们在使用的时候需要不断的学习,这样才能不断的适应相关语言技术的变化.所有的对象池都有一个共同的目的,那就是为了提高对象的使用率,从而达到提高程序效率的目的. 比如对于Servlet,它被设计为多线程的(如果它是单线程的,你就可以想象,当1000个人同时请求一个网页时,在第一个人获得请求结果之前,其它999个人都在郁闷地等待),如果为每个用户的每一次请求都创建一个新的线程对象来运行的话,系统就会在创建线程和销毁线程上耗费很大的开销,大大降低系统的