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

Java 網路程式設計:TCP 客戶端與 ServerSocket 深度實戰(三)

     編輯:Java 程式設計入門

第五節:構建 TCP 客戶端 — Daytime 協議實戰

Daytime 服務(RFC 867)運行在 埠 13,回傳當前日期時間字串。Unix 系統通常內建,Windows 需自行實作 Server。

DaytimeClient 完整代碼

import java.net.*;
import java.io.*;

public class DaytimeClient {
    public static final int SERVICE_PORT = 13;

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("用法: java DaytimeClient <主機名>");
            return;
        }

        String hostname = args[0];

        try {
            // 1. 建立連線
            Socket daytime = new Socket(hostname, SERVICE_PORT);
            System.out.println("連線已建立");

            // 2. 設定超時(防掛死)
            daytime.setSoTimeout(2000);

            // 3. 讀取回應
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(daytime.getInputStream())
            );
            System.out.println("伺服器回應: " + reader.readLine());

            // 4. 關閉資源
            daytime.close();
        } catch (IOException e) {
            System.err.println("錯誤: " + e);
        }
    }
}

關鍵步驟解析

  1. new Socket(host, port):主動發起三次交握,阻塞直到連線成功或超時
  2. setSoTimeout(ms):讀取阻塞上限,避免服務端不回應導致客戶端永久等待
  3. 使用 BufferedReader 包裝 InputStreamReader:高效按行讀取文本協議
  4. close():釋放檔案描述符,發送 FIN 封包結束連線

執行範例

java DaytimeClient localhost
# 或指定遠端 Unix 主機
java DaytimeClient time.nist.gov

前提:目標主機必須在埠 13 運行 Daytime 服務。


第六節:ServerSocket — 伺服端套接字核心機制

客戶端 vs 伺服端 Socket 差異

特性客戶端 Socket伺服端 ServerSocket
綁定埠任意臨時埠固定知名埠(如 80, 13, 22)
連線方向主動連接被動監聽 accept()
併發模型單連線多連線並發(每次 accept 產生新 Socket)
生命週期短暫長期運行

ServerSocket 工作流程

ServerSocket server = new ServerSocket(PORT);
while (true) {
    Socket client = server.accept();  // 阻塞等待連線
    // 此處 client 即為已建立連線的 Socket
    // 可啟動新執行緒處理:new Thread(() -> handle(client)).start();
}

核心特性

  • 連線工廠:accept() 返回的 Socket 已完成三次交握,可直接讀寫
  • 併發處理:單執行緒循環 accept + 執行緒池處理業務,或 NIO 非阻塞模型
  • 綁定具體 IP:new ServerSocket(port, backlog, InetAddress.getByName("192.168.1.1")) 限制介面
  • backlog 參數:待連線隊列長度,建議 50-200,防 SYN Flood

DaytimeServer 參考實作

public class DaytimeServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(13);
        System.out.println("Daytime Server 啟動,監聽埠 13...");
        ExecutorService pool = Executors.newCachedThreadPool();

        while (true) {
            final Socket client = server.accept();
            pool.execute(() -> {
                try (PrintWriter out = new PrintWriter(client.getOutputStream(), true)) {
                    out.println(new java.util.Date().toString());
                } catch (IOException ignored) {}
                finally { try { client.close(); } catch (IOException ignored) {} }
            });
        }
    }
}

下一步預告

後續將介紹:非阻塞 I/O (NIO)、SSL/TLS 安全通訊、自定義協議設計、連線池與零拷貝傳輸。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved