本文為 FTP 客戶端系列第八篇,詳細剖析 FTP 連接建立與斷開的核心邏輯、異常處理及 UI 狀態同步機制。
用戶輸入服務器 IP、端口(默認 21)、用戶名、密碼後點擊「連接」,觸發 linkButtonActionPerformed 方法,核心步驟:
FtpClient.openServer() 建立 TCP 連接private void linkButtonActionPerformed(ActionEvent evt) {
try {
String server = serverTextField.getText();
int port = Integer.parseInt(portTextField.getText().trim() == "" ? "21" : portTextField.getText().trim());
String user = userTextField.getText().trim();
String pass = new String(PassField.getPassword()).trim();
cutLinkButton.doClick(); // 先斷開舊連接
ftpClient = new FtpClient();
ftpClient.openServer(server, port);
ftpClient.login(user, pass);
ftpClient.binary();
if (ftpClient.serverIsOpen()) {
CUT_LINK_ACTION.setEnabled(true);
localPanel.setFtpClient(server, port, user, pass);
ftpPanel.setFtpClient(ftpClient);
localPanel.getActionMap().get("uploadAction").setEnabled(true);
ftpPanel.getActionMap().get("downAction").setEnabled(true);
ftpPanel.refreshCurrentFolder();
queuePanel.startQueue();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
點擊「斷開」觸發 CutLinkAction.actionPerformed,執行清理操作:
ftpClient 引用,禁用相關操作按鈕public void actionPerformed(ActionEvent e) {
try {
frame.ftpPanel.stopDownThread();
frame.localPanel.stopUploadThread();
frame.getFtpPanel().getQueue().clear();
frame.getFtpPanel().clearTable();
frame.getLocalPanel().getQueue().clear();
if (frame.ftpClient != null && frame.ftpClient.serverIsOpen()) {
frame.ftpClient.sendServer("QUIT\r\n");
frame.ftpClient.readServerResponse();
frame.ftpClient = null;
}
// 禁用按鈕...
} catch (IOException e1) {
e1.printStackTrace();
}
}
