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

Java Socket 程式設計實現跨平台多用戶伺服器通訊

     編輯:Java 相關知識

前言

隨著區域網路規模擴大,異構作業系統(Linux、Windows NT、Windows 98)共存成為常態。傳統通訊軟體多針對單一平台,難以滿足跨平台互通需求。Java 「Write Once, Run Anywhere」特性配合 Socket API,提供了優雅的解決方案。本文展示一個基於 TCP 的多用戶聊天室伺服器/客戶端完整實作,驗證跨平台互通能力。

一、系統架構設計

  • 傳輸協定:TCP(可靠、有序、面向連線)
  • 通訊模型:單伺服器多客戶端,伺服器採用 NetworkServer 監聽固定埠(1111),每個連線啟動獨立服務執行緒
  • 資料格式:純文字行協定,以換行符為訊息邊界
  • 跨平台關鍵:Java bytecode 無平台差異,唯需各平台安裝對應 JRE

二、伺服器端核心實作

1. 類別結構

class Server extends NetworkServer {
    DataInputStream netInput;
    PrintStream netOutput;
    // 核心方法:main、建構子、serviceRequest、read/write 輔助方法
}

2. 關鍵程式碼片段

public static void main(String[] args) {
    new Server();  // 啟動伺服器
}

public Server() {
    try {
        startServer(1111);  // 綁定埠 1111
    } catch (Exception e) {
        System.out.println("Unable to start server.");
        return;
    }
    System.out.println("Waiting for clients...");
}

public void serviceRequest() {
    netInput = new DataInputStream(clientInput);
    netOutput = System.out;  // 示例輸出至控制台,實際應廣播給所有客戶端
    String user = readNetInput();
    System.out.println(user + " connected!");
    
    while (true) {
        String msg;
        if ((msg = readNetInput()) == null) break;  // 客戶端斷開
        writeNetOutput(user + ":" + msg);  // 廣播邏輯需擴展
    }
    System.out.println(user + " has disconnected!");
}

3. 關鍵設計點

  • 繼承 NetworkServer(Sun 早期私有 API,現建議改用標準 ServerSocket)
  • 單執行緒處理單一連線,簡單但擴展性受限
  • 輸出導向 System.out 僅為示例,實際生產需維護客戶端輸出流集合實現廣播

三、客戶端核心實作

1. 啟動參數

java Client <server_ip> <username>
// 例:java Client 192.168.100.1 NT

2. 連線流程

public Client(String host, String username) throws IOException {
    super(host, 1111);  // 連線伺服器
    if (serverIsOpen()) {
        netInput = new DataInputStream(System.in);  // 鍵盤輸入
        netOutput = serverOutput;                   // 寫向伺服器
        netOutput.println(username);                // 註冊用戶名
        chat();                                     // 進入聊天迴圈
    }
}

3. 聊天迴圈與退出機制

void chat() {
    System.out.println("Type EXIT to exit");
    while (true) {
        String msg = readNetInput();  // 讀取鍵盤輸入
        if (msg.equalsIgnoreCase("EXIT")) break;
        writeNetOutput(msg);          // 發送至伺服器
    }
    closeServer();
    System.out.println("Done!");
}

四、跨平台部署驗證實錄

  1. 開發編譯環境:Windows 98 + JDK 1.1.5
    javac Server.java
    javac Client.java
  2. 伺服器部署:將 Server.class 複製至 Linux 伺服器(已安裝 Java RPM)
    java Server
  3. 客戶端部署:將 Client.class 複製至 Windows NT 工作站
    jview Client 192.168.100.1 NT
  4. 結果:跨平台通訊成功,伺服器支援多用戶同時接入

五、現代化改良建議

原始碼使用 sun.net.* 內部類別,屬於 JDK 1.1 時代產物,現代專案建議重構:

原始寫法現代標準寫法 (JDK 1.7+)
extends NetworkServerServerSocket serverSocket = new ServerSocket(1111);
extends NetworkClientSocket socket = new Socket(host, 1111);
DataInputStream/PrintStreamBufferedReader/PrintWriter 或 NIO ByteBuffer
單執行緒阻塞 I/O執行緒池 + NIO 選擇器 / Netty 框架
控制台廣播維護 ConcurrentHashMap<String, PrintWriter> 客戶端註冊表

六、完善功能清單

  • [ ] 私聊指令(@username message)
  • [ ] 線上用戶列表查詢
  • [ ] 訊息歷史記錄持久化
  • [ ] SSL/TLS 加密傳輸
  • [ ] 心跳檢測與斷線重連
  • [ ] 伺服器集群與會話複製

結語

這個經典範例雖使用舊版 API,但清晰展示了 Java 跨平台網路程式設計的核心流程:編譯一次,到處執行。現代開發者應掌握標準 java.net 與 NIO/Netty 技術棧,在理解基礎 Socket 機制上,構建高併發、高可用的分散式通訊系統。

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