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

Java 在 Client/Server 架構中的應用:從 C/S 到 B/S 的演進與實戰

     編輯:Java 相關知識

Java 應用環境本質上是瀏覽器/服務器模型,即 Web 三層架構,區別於傳統二層 C/S 架構。本文剖析 Java 網絡應用模型、核心類庫與 Socket 通訊實戰代碼。

一、Java 網絡應用模型:三層架構

傳統 C/S 通過消息傳遞直連資料庫。Web 模型將服務端拆分為:

  • 應用服務器:業務邏輯、Web 容器,處理 HTTP 請求、會話管理、動態頁面生成。
  • 資料庫服務器:專職數據存儲與查詢,提升安全性、擴展性與維護性。

客戶端瀏覽器僅負責展示與交互,業務邏輯前移至應用服務器,實現「瘦客戶端、厚服務端」。

二、Java 網絡類庫支援體系

Java 針對分布式計算提供豐富網絡 API:

  • URL/URLConnection:統一資源定位,訪問網絡資源如同本地文件。
  • 協議支援:java.net(基礎/TCP/UDP)、java.net.ftp、java.net.www.http、java.net.www.html、java.net.www.content。
  • 動態擴充協議:適應 Internet 協議演進,可動態註冊處理器。

運算分散策略:服務端負責查詢計算,客戶端負責渲染展示,提升整體吞吐與動態擴展能力。

三、基於 Socket 的請求-應答模式實戰

典型流程:

  1. 服務器 ServerSocket 監聽端口。
  2. 客戶端 Socket 發起連接。
  3. 服務器 accept() 返回新 Socket,派生線程處理通訊。
  4. 雙方透過輸入/輸出流交換數據。
  5. 會話結束關閉連接。

關鍵設計要點

  • ServerSocket 分派:主線程循環 accept(),每連接創建 Connection 線程處理 I/O,主線程繼續監聽。
  • 多線程並發:每客戶端獨立線程隔離業務邏輯,避免阻塞主監聽迴路。
  • 流封裝:DataInputStream/PrintStream 包裝 Socket 原始流,便捷處理文本行讀寫。

服務端核心代碼

public class Server extends Thread {
    public static final int DEFAULT_PORT = 6543;
    private ServerSocket listenSocket;

    public Server(int port) throws IOException {
        this.listenSocket = new ServerSocket(port == 0 ? DEFAULT_PORT : port);
        start();
    }

    @Override
    public void run() {
        try {
            while (true) {
                Socket client = listenSocket.accept();
                new Connection(client); // 隱含 start()
            }
        } catch (IOException e) { /* 日誌記錄 */ }
    }

    static class Connection extends Thread {
        private final Socket client;
        private final DataInputStream in;
        private final PrintStream out;

        Connection(Socket socket) throws IOException {
            this.client = socket;
            this.in = new DataInputStream(client.getInputStream());
            this.out = new PrintStream(client.getOutputStream());
            start();
        }

        @Override
        public void run() {
            try {
                String line;
                while ((line = in.readLine()) != null) {
                    // 業務邏輯:反轉字符串返回
                    out.println(new StringBuilder(line).reverse());
                }
            } catch (IOException ignored) {
            } finally {
                try { client.close(); } catch (IOException ignored) {}
            }
        }
    }

    public static void main(String[] args) {
        new Server(args.length > 0 ? Integer.parseInt(args[0]) : 0);
    }
}

客戶端核心代碼

public class Client {
    public static final int DEFAULT_PORT = 6543;

    public static void main(String[] args) throws IOException {
        String host = args[0];
        int port = args.length > 1 ? Integer.parseInt(args[1]) : DEFAULT_PORT;

        try (Socket socket = new Socket(host, port);
             DataInputStream in = new DataInputStream(socket.getInputStream());
             PrintStream out = new PrintStream(socket.getOutputStream());
             BufferedReader console = new BufferedReader(new InputStreamReader(System.in))) {

            System.out.println("Connected to " + socket.getInetAddress() + ":" + socket.getPort());

            String line;
            while ((line = console.readLine()) != null) {
                out.println(line);
                String response = in.readLine();
                if (response == null) break;
                System.out.println(response);
            }
        }
    }
}

四、現代化演進建議

上述為基礎 Socket 編程教學模型。生產環境建議採用:

  • NIO/Netty 非阻塞高併發框架替代阻塞 I/O 多線程模型。
  • HTTP/REST/gRPC 等標準協議替代自定義文本協議。
  • Spring Boot、Dubbo、gRPC 等微服務框架處理服務治理、負載均衡、熔斷限流。
  • 連接池、異步非阻塞、響應式編程提升資源利用率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved