首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

利用 Java 執行緒池實作 TCP 連接埠掃描器

     編輯:J2EE

設計概念

掃描大範圍連接埠若逐一建立執行緒,系統資源易耗盡。採用 ExecutorService 固定大小執行緒池,可控制並發數、重用執行緒、提升掃描效率。

關鍵程式碼解析

private void getLocal() {
    String ip = getIP();  // 取得本機 IP
    int startPort = Integer.parseInt(txPortStart1.getText().trim());
    int endPort   = Integer.parseInt(txPortEnd1.getText().trim());
    // 參數驗證略...
    scan(ip, startPort, endPort);
    runThread();  // 監控掃描完成
}

private void scan(String ip, int startPort, int endPort) {
    setBtnEdit(false);
    status.setText("掃描中...");
    table.addRow(new String[]{ip, ""});

    ExecutorService exec = Executors.newFixedThreadPool(10);  // 固定 10 條執行緒
    for (int port = startPort; port <= endPort; port++) {
        exec.execute(new RunSocket(ip, port));  // 提交掃描任務
    }
    exec.shutdown();  // 不再接受新任務,等待現有任務完成
}

核心類別 RunSocket (概念)

class RunSocket implements Runnable {
    private String ip;
    private int port;
    public RunSocket(String ip, int port) { this.ip = ip; this.port = port; }
    @Override
    public void run() {
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(ip, port), 1000); // 1秒逾時
            // 連線成功 -> 更新 UI 顯示開放連接埠
            SwingUtilities.invokeLater(() -> table.addRow(new String[]{ip, String.valueOf(port)}));
        } catch (IOException ignored) { /* 連線失敗視為關閉 */ }
    }
}

優勢總結

  • 資源可控: 固定 10 條執行緒,避免大量連接埠併發導致 OOM 或檔案描述符耗盡。
  • 效能優異: 執行緒重用消除建立/銷毀開銷,掃描速度遠超單執行緒循環。
  • 程式碼簡潔: ExecutorService 封裝生命週期管理,業務邏輯專注於掃描本身。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved