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

Java 非同步網路程式設計:客戶端自動重連與容錯機制實作

     編輯:Java 程式設計入門

應用場景與挑戰

在客戶/伺服器系統中,常遇到:客戶端先啟動需等待伺服器啟動後自動連線;通訊中伺服器異常中斷,客戶端需偵測並自動清理連線、回到初始狀態等待伺服器重啟。傳統阻塞式 I/O 難以優雅處理這些非同步情境。

核心設計:定時器驅動的狀態機

採用 javax.swing.Timer 定期檢查連線狀態,封裝於 NetComm 類別中,對外隱藏定時器細節,提供簡潔 API。狀態變數 net_state:0=離線/待連線,1=已連線/通訊中。

關鍵程式碼實作

public class NetComm implements ActionListener {
    private javax.swing.Timer timer = new javax.swing.Timer(3000, this); // 每 3 秒觸發
    private Socket sock;
    private InetAddress serverAddr;
    private int serverPort;
    public static int net_state = 0; // 靜態共享狀態

    public NetComm(InetAddress addr, int port) {
        this.serverAddr = addr;
        this.serverPort = port;
    }

    // 初始化連線
    public void NetComm_Init() {
        net_state = 1;
        try {
            sock = new Socket(serverAddr, serverPort);
        } catch (IOException e) {
            net_state = 0; // 連線失敗,保持離線狀態
        }
        timer.start();
    }

    // 資料收發
    public void NetComm_Data() {
        try {
            OutputStream os = sock.getOutputStream();
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
            out.write("java by ghf@china.com");
            out.flush();

            BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String str;
            while ((str = in.readLine()) != null) {
                System.out.println(str); // 處理接收資料
            }
            in.close();
        } catch (IOException e) {
            NetComm_Close(); // 異常時關閉資源
            net_state = 0;   // 回到離線狀態
        }
        timer.restart(); // 重新啟動定時器
    }

    // 關閉資源
    public void NetComm_Close() {
        if (sock != null) {
            try { sock.close(); } catch (IOException ignored) {}
        }
    }

    // 定時器事件處理:狀態機核心
    @Override
    public void actionPerformed(ActionEvent e) {
        if (net_state == 0) {
            NetComm_Init(); // 離線狀態:嘗試連線
        } else {
            NetComm_Data(); // 連線狀態:進行資料收發
        }
    }
}

設計亮點與擴充建議

  • 封裝性:定時器、Socket、狀態機全內聚於 NetComm,使用者無需感知底層輪詢邏輯。
  • 容錯:任何 I/O 異常即觸發 NetComm_Close() 並重置狀態,自動進入下一輪重連嘗試。
  • 回調擴充:可加入 EventNotifier 介面,於連線建立、斷開、重連成功時通知上層應用,實現解耦。
  • 優化點:生產環境建議改用 NIO (Selector) 或 Netty 等框架,以事件驅動取代輪詢,降低資源佔用與延遲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved