本質是兩個進程通訊:Server 綁定固定 IP+Port 監聽,Client 主動連接。Java 在 java.net 包提供 ServerSocket 和 Socket 實現該模型。
| 類 | 關鍵方法 | 說明 |
|---|---|---|
ServerSocket | accept() | 阻塞等待客戶端連接,返回新 Socket 處理該連接 |
Socket | getInputStream(), getOutputStream() | 獲取字節流,通常包裝為 BufferedReader/PrintWriter 處理文本 |
InetAddress | getLocalHost(), getByName(host) | IP 地址解析 |
import java.io.*;
import java.net.*;
public class EchoServer {
public static void main(String[] args) throws IOException {
try (ServerSocket server = new ServerSocket(5678)) {
System.out.println("Server 啟動,監聽 5678...");
while (true) {
try (Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"), true)) {
String line;
while ((line = in.readLine()) != null) {
System.out.println("收到: " + line);
out.println("Echo: " + line);
if ("end".equalsIgnoreCase(line)) break;
}
}
}
}
}
}
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws Exception {
try (Socket socket = new Socket(InetAddress.getLocalHost(), 5678);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true);
BufferedReader console = new BufferedReader(new InputStreamReader(System.in))) {
System.out.println("已連接,輸入 'end' 退出");
String line;
while ((line = console.readLine()) != null) {
out.println(line);
System.out.println("服務端回覆: " + in.readLine());
if ("end".equalsIgnoreCase(line)) break;
}
}
}
}
accept() 循環只能串行處理,生產環境需線程池或 NIO (Selector)socket.setSoTimeout(ms) 防止讀阻塞永久等待;長連接需應用層心跳檢測存活SSLSocket/SSLServerSocket) 加密傳輸