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

Java 在 Client/Server 網路架構中的應用與實作

     編輯:Java 相關知識

隨著 Java 語言普及及其與 Internet Web 的緊密結合,其跨平台、面向物件、分散式、多執行緒與完善安全機制等特性,使其成為現代資訊系統建設的優質開發平台與執行環境。

一、Java 網路應用模型:三層 B/S 架構

完整 Java 應用環境本質上是瀏覽器/伺服器模型(B/S),區別於傳統 C/S 兩層結構。Web 模型將伺服器端分解為 應用伺服器 (Web Server) 與 資料庫伺服器,形成三層架構。

Java 網路類庫為分散式計算提供強力支援:

  • 資料分散:URL 物件讓網路資源存取如同本地檔案系統般簡單
  • 運算分散:C/S 模式將運算從伺服器分散至客戶端(伺服器負責查詢,客戶端負責顯示組織),提升整體效率與動態擴充性

Java 網路類庫支援多種 Internet 協定,核心子類庫包括:

子類庫功能
java.net基礎網路功能(含遠程登入 Telnet)
java.net.ftpFTP 協定處理
java.net.www.contentWWW 頁面內容處理
java.net.www.htmlHTML 語言支援
java.net.www.httpHTTP 協定支援

二、C/S 環境下 Java 應用程式運作機制

基於連接的網路通訊模式:定義通訊協定 → 建立 Socket 可靠連線 → 客戶端發請求 → 伺服器監聽響應 → 可靠傳輸資料。典型「請求-應答」流程:

  1. 伺服器監聽指定埠口
  2. 客戶端發出請求
  3. 伺服器接收請求
  4. 伺服器處理並返回結果
  5. 重複上述過程完成會話

關鍵設計要點

  • ServerSocket 處理連線請求:客戶端連線時分配新 Socket 物件至新埠口處理通訊,主執行緒持續監聽
  • 多執行緒機制:Server 物件本身為執行緒,run() 無限循環監聽;新連線創建 Connection 物件(執行緒)處理基於 Socket 的通訊
  • 客戶端通訊流:創建 Socket → 建立 DataInputStream 讀取 / PrintStream 寫入 → 從標準輸入讀取資料發送伺服器 → 接收應答輸出至標準輸出

三、伺服器端 Java 程式實作

// Server.java
import java.io.*; import java.net.*;

public class Server extends Thread {
    public final static int Default_Port = 6543;
    protected int port;
    protected ServerSocket listen_socket;

    public static void fail(Exception e, String msg) {
        System.err.println(msg + ": " + e); System.exit(1);
    }

    public Server(int port) {
        if (port == 0) port = Default_Port;
        this.port = port;
        try { listen_socket = new ServerSocket(port); }
        catch (IOException e) { fail(e, "Exception creating server socket"); }
        System.out.println("Server: listening on port " + port);
        this.start();
    }

    public void run() {
        try {
            while (true) {
                Socket client_socket = listen_socket.accept();
                new Connection(client_socket);
            }
        } catch (IOException e) { fail(e, "Exception while listening for connections"); }
    }

    public static void main(String args[]) {
        int port = 0;
        if (args.length == 1) {
            try { port = Integer.parseInt(args[0]); }
            catch (NumberFormatException e) { port = 0; }
        }
        new Server(port);
    }
}

class Connection extends Thread {
    protected Socket client;
    protected DataInputStream in;
    protected PrintStream out;

    public Connection(Socket client_socket) {
        client = client_socket;
        try {
            in = new DataInputStream(client.getInputStream());
            out = new PrintStream(client.getOutputStream());
        } catch (IOException e) {
            try { client.close(); } catch (IOException e2) {}
            System.err.println("Exception while getting socket stream: " + e);
            return;
        }
        this.start();
    }

    public void run() {
        try {
            for (;;) {
                String line = in.readLine();
                if (line == null) break;
                int len = line.length();
                StringBuffer revline = new StringBuffer(len);
                for (int i = len-1; i >= 0; i--)
                    revline.append(line.charAt(i));
                out.println(revline.toString());
            }
        } catch (IOException e) {}
        finally {
            try { client.close(); } catch (IOException e2) {}
        }
    }
}

四、客戶端 Java 程式實作

// Client.java
import java.io.*; import java.net.*;

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

    public static void usage() {
        System.out.println("Usage: java Client  [port]");
        System.exit(0);
    }

    public static void main(String args[]) {
        int port = Default_Port;
        Socket s = null;
        if ((args.length != 1) && (args.length != 2)) usage();
        if (args.length == 2) {
            try { port = Integer.parseInt(args[1]); }
            catch (NumberFormatException e) { usage(); }
        }
        try {
            s = new Socket(args[0], port);
            DataInputStream sin = new DataInputStream(s.getInputStream());
            PrintStream sout = new PrintStream(s.getOutputStream());
            DataInputStream in = new DataInputStream(System.in);
            System.out.println("Connected to " + s.getInetAddress() + ":" + s.getPort());
            for (;;) {
                System.out.print(" > "); System.out.flush();
                String line = in.readLine();
                if (line == null) break;
                sout.println(line);
                line = sin.readLine();
                if (line == null) {
                    System.out.println("Connection closed by server.");
                    break;
                }
                System.out.println(line);
            }
        } catch (IOException e) { System.err.println(e); }
        finally {
            try { if (s != null) s.close(); } catch (IOException e2) {}
        }
    }
}

執行客戶端程式需指定伺服器主機名為第一參數,埠號為第二參數(可省略)。本程式在 NT 4.0 TCP/IP 環境下經 JDK 1.1 測試通過。

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