在網路除錯與測試中,nc (Netcat) 是一把瑞士軍刀,能輕鬆建立 TCP/UDP 連線、傳送資料、掃描埠口。若想在 Java 環境中擁有同樣能力,並搭配圖形介面 (GUI) 讓操作更直覺,該如何實作?本文將帶你逐步打造一個具備連線管理、資料收發、即時日誌顯示的 Java 版 nc 工具,完整呈現從 Socket 連線到 Swing 介面整合的核心邏輯。
專案採用經典的 主視窗類別 fs 啟動程式,並委派 fsframe 繼承 JFrame 負責所有 UI 佈局與網路互動。關鍵元件包含:
hostfield)、埠口輸入框 (portfield)、連線按鈕 (lianjie)。input)、執行按鈕 (act)。log) 搭配 JScrollPane,即時顯示連線狀態、收發資料與錯誤訊息。public fsframe() {
setSize(Toolkit.getDefaultToolkit().getScreenSize().width / 2, 380);
setResizable(false);
getContentPane().setLayout(new BorderLayout());
// ... 元件初始化與佈局 ...
// 視窗置中邏輯
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = getSize();
setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
}
使用 DataInputStream/DataOutputStream 包裝 Socket 串流,支援二進位與文字資料收發:
lianjie.addActionListener(e -> {
String host = hostfield.getText().trim();
String portStr = portfield.getText().trim();
if (host.isEmpty() || portStr.isEmpty()) {
JOptionPane.showMessageDialog(this, "主機與埠口不可為空!");
return;
}
int port = Integer.parseInt(portStr);
log.append("正在連線至 " + host + ":" + port + " ...\n");
try {
conn = new Socket(InetAddress.getByName(host), port);
in = new DataInputStream(conn.getInputStream());
out = new DataOutputStream(conn.getOutputStream());
log.append("連線成功!\n");
} catch (UnknownHostException ex) {
log.append("找不到主機: " + ex.getMessage() + "\n");
} catch (IOException ex) {
log.append("連線失敗: " + ex.getMessage() + "\n");
}
});
採用同步阻塞模式:發送使用者輸入的文字,隨即嘗試讀取一行回應:
act.addActionListener(e -> {
if (out == null || in == null) {
log.append("尚未建立連線。\n");
return;
}
String cmd = input.getText();
if (cmd.isEmpty()) return;
try {
log.append("> " + cmd + "\n");
out.writeBytes(cmd + "\n");
out.flush();
input.setText("");
String response = in.readLine(); // 同步等待回應
if (response != null) log.append(response + "\n");
} catch (IOException ex) {
log.append("通訊錯誤: " + ex.getMessage() + "\n");
}
});
in.readLine() 會阻塞事件派發執行緒 (EDT),導致介面凍結。建議改用 SwingWorker 或獨立讀取執行緒持續監聽伺服器推播資料。ByteBuffer 處理非文字協定。SSLSocketFactory 實現加密連線。專案僅需兩個類別即可編譯執行:
fs.java:程式進入點,設定 Metal Look & Feel 並啟動 fsframe。fsframe.java:包含所有 UI 元件、事件處理、Socket 通訊邏輯。編譯執行:
javac fs.java fsframe.java
java fs
這個範例展示了 Java Socket 程式設計的基礎流程:建立連線 → 取得串流 → 讀寫資料 → 異常處理 → 關閉資源,並結合 Swing 建立實用的網路除錯小工具。雖然採用傳統阻塞 I/O (BIO) 架構,但對於簡單測試、教學示範或低併發場景已足夠。若需支援高併發或長連線推播,後續可遷移至 NIO (Netty/Mina) 或 Java 21+ 的虛擬執行緒架構。