許多開發者在學習 Java 網路程式設計時,都會對 Socket 的運作機制感到好奇。本文提供一個簡單易懂的 Socket 伺服器基礎範例,實作了客戶端連線接收與訊息廣播功能,適合初學者參考學習。
這個伺服器採用多執行緒架構:主執行緒負責監聽連線請求,每個客戶端連線建立後會啟動一個獨立的 Exchange 執行緒處理資料收發。伺服器使用 Vector 集合管理所有活躍的客戶端連線資訊,雖然 ArrayList 效能較佳,但 Vector 的執行緒安全特性在這裡更適合。
public class SocketServer2 extends Thread {
private Vector<Exchange> clients = new Vector<>();
private ServerSocket serverSocket;
public SocketServer2() {
try {
serverSocket = new ServerSocket(8000);
this.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
try {
Socket client = serverSocket.accept();
Exchange handler = new Exchange(this, client.getInputStream(), client.getOutputStream());
clients.add(handler);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void broadcast(String message) {
for (Exchange client : clients) {
try {
client.getOutputStream().write((message + "\n").getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class Exchange extends Thread {
private SocketServer2 server;
private InputStream input;
private OutputStream output;
public Exchange(SocketServer2 server, InputStream input, OutputStream output) {
this.server = server;
this.input = input;
this.output = output;
this.start();
}
public void run() {
try {
StringBuilder buffer = new StringBuilder();
int ch;
while ((ch = input.read()) != -1) {
if (ch == '\n') break;
buffer.append((char) ch);
}
if (ch == -1) return; // 連線中斷
server.broadcast(buffer.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
編譯執行後,伺服器會在 8000 埠監聽。可使用 telnet 或自製客戶端連線測試,任何客戶端發送的訊息(以換行符結尾)都會廣播給所有連線中的客戶端。這個簡單範例展示了 Socket 程式設計的核心概念:ServerSocket.accept() 阻塞等待連線、多執行緒並發處理、輸入輸出流操作。
BufferedReader/PrintWriter 簡化文字處理java.nio) 實現非阻塞高併發掌握這個基礎模型後,您可以輕鬆擴展出聊天室、即時遊戲伺服器等應用。建議進一步研讀《Java 網路程式設計》等經典教材,深入理解 TCP/IP 協議細節與 Java NIO 機制。