隨著區域網路規模擴大,異構作業系統(Linux、Windows NT、Windows 98)共存成為常態。傳統通訊軟體多針對單一平台,難以滿足跨平台互通需求。Java 「Write Once, Run Anywhere」特性配合 Socket API,提供了優雅的解決方案。本文展示一個基於 TCP 的多用戶聊天室伺服器/客戶端完整實作,驗證跨平台互通能力。
NetworkServer 監聽固定埠(1111),每個連線啟動獨立服務執行緒class Server extends NetworkServer {
DataInputStream netInput;
PrintStream netOutput;
// 核心方法:main、建構子、serviceRequest、read/write 輔助方法
}
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!");
}
NetworkServer(Sun 早期私有 API,現建議改用標準 ServerSocket)System.out 僅為示例,實際生產需維護客戶端輸出流集合實現廣播java Client <server_ip> <username>
// 例:java Client 192.168.100.1 NT
public Client(String host, String username) throws IOException {
super(host, 1111); // 連線伺服器
if (serverIsOpen()) {
netInput = new DataInputStream(System.in); // 鍵盤輸入
netOutput = serverOutput; // 寫向伺服器
netOutput.println(username); // 註冊用戶名
chat(); // 進入聊天迴圈
}
}
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!");
}
javac Server.java
javac Client.java
Server.class 複製至 Linux 伺服器(已安裝 Java RPM)
java Server
Client.class 複製至 Windows NT 工作站
jview Client 192.168.100.1 NT
原始碼使用 sun.net.* 內部類別,屬於 JDK 1.1 時代產物,現代專案建議重構:
| 原始寫法 | 現代標準寫法 (JDK 1.7+) |
|---|---|
extends NetworkServer | ServerSocket serverSocket = new ServerSocket(1111); |
extends NetworkClient | Socket socket = new Socket(host, 1111); |
DataInputStream/PrintStream | BufferedReader/PrintWriter 或 NIO ByteBuffer |
| 單執行緒阻塞 I/O | 執行緒池 + NIO 選擇器 / Netty 框架 |
| 控制台廣播 | 維護 ConcurrentHashMap<String, PrintWriter> 客戶端註冊表 |
@username message)這個經典範例雖使用舊版 API,但清晰展示了 Java 跨平台網路程式設計的核心流程:編譯一次,到處執行。現代開發者應掌握標準 java.net 與 NIO/Netty 技術棧,在理解基礎 Socket 機制上,構建高併發、高可用的分散式通訊系統。