当前位置: 代码迷 >> J2SE >> 怎么快速扫描局域网内所有IP的某一个端口是否开启
  详细解决方案

怎么快速扫描局域网内所有IP的某一个端口是否开启

热度:75   发布时间:2016-04-24 00:33:19.0
如何快速扫描局域网内所有IP的某一个端口是否开启
例如:

本机IP: 123.333.222.10

需要扫描 IP: 123.333.222.1:6610 - 123.333.222.224:6610 判断端口是否开启 或者说是否有server在监听这个端口

请问如何快速(1秒内)完成上面的224个执行(from 1 to 224)

我自己贴一段代码 可以用是可以用 但是太慢了 
本来想用
Java code
ExecutorService executor = Executors.newSingleThreadExecutor();executor.invokeAll(Arrays.asList(new Task(ipHead, tail, 6610)),200, TimeUnit.MILLISECONDS);executor.shutdown();

来提到效率的 但是好像没用 不知道是什么问题 


runnable code:

Java code
import java.net.*;import java.util.Arrays;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.io.*;public class JPortScanner1 {    public JPortScanner1(String IP, int port) {    }    public static void main(String[] args) throws IOException,            InterruptedException {        String ipHead;        int lastPoint;        String IP = InetAddress.getLocalHost().getHostAddress();        lastPoint = IP.lastIndexOf('.');        ipHead = IP.substring(0, ++lastPoint);        for (int tail = 234; tail < 255; tail++) {            ExecutorService executor = Executors.newSingleThreadExecutor();            executor.invokeAll(Arrays.asList(new Task(ipHead, tail, 6610)),                    200, TimeUnit.MILLISECONDS);            executor.shutdown();        }    }}class Task implements Callable<String> {    String ipHead;    int ipTail;    int port;    public Task(String ipHead, int ipTail, int port) {        this.ipHead = ipHead;        this.ipTail = ipTail;        this.port = port;    }    public String call() throws Exception {        Socket connect = new Socket();        connect.setSoTimeout(100);            try {                            connect = new Socket(this.ipHead + ipTail, this.port);                connect.close();                System.out.println("Open port:" + this.ipHead + ipTail + " "                        + this.port);            } catch (UnknownHostException e) {                System.out.println("Unknown Port:" + this.ipHead + ipTail + " "                        + this.port);            } catch (IOException e) {                System.out.println("Unknown Port:" + this.ipHead + ipTail + " "                        + this.port);            }                 System.out.println("Finished!");        return null;    }}



------解决方案--------------------
不动手无说服力(并不说我是个高手,只是想说怎么这么多人不去思考动手呢)
我测试的一个示例也就200多微妙(双核CPU):
Java code
import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;import java.util.Collection;import java.util.LinkedList;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class JPortScanner1 {    public static void main(String[] args) throws InterruptedException, UnknownHostException {        String ipHead;        int lastPoint;        String IP = InetAddress.getLocalHost().getHostAddress();        lastPoint = IP.lastIndexOf('.');        ipHead = IP.substring(0, ++lastPoint);        ExecutorService executor = Executors.newCachedThreadPool();        Collection<Callable<String>> list = new LinkedList<Callable<String>>();        long start = System.currentTimeMillis();        for (int tail = 1; tail < 255; tail++) {            list.add(new Task(ipHead, tail, 8081));        }        executor.invokeAll(list);        executor.shutdown();        long end = System.currentTimeMillis();        System.out.println("All time: " + (end - start) + " milliseconds");    }}class Task implements Callable<String> {    String ipHead;    int ipTail;    int port;    public Task(String ipHead, int ipTail, int port) {        this.ipHead = ipHead;        this.ipTail = ipTail;        this.port = port;        System.out.println(ipHead + ipTail + ":" + port);    }    public String call(){        Socket connect = new Socket();        try {            connect.connect(new InetSocketAddress(ipHead + ipTail, port), 100);             while(true){                    if(connect.isConnected()){                        //System.out.println(ipHead + ipTail + ":" + port + " success");                        break;                    }                }                connect.close();        } catch (IOException e) {            //System.out.println(ipHead + ipTail + ":" + port + " failure");        }        return null;    }}
  相关解决方案