Socket 代表網路通訊端點,雙向通訊透過兩個串流實現:
getInputStream():接收對端資料(輸入流)getOutputStream():發送資料給對端(輸出流)ServerSocket server = new ServerSocket(9998);
while (true) {
Socket client = server.accept(); // 阻塞等待連線
// 建立緩衝文字流
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(
client.getOutputStream(), true); // auto-flush
// 處理對話(可移至獨立執行緒)
String msg;
while ((msg = in.readLine()) != null) {
System.out.println("收到: " + msg);
out.println("Echo: " + msg);
}
// 關閉順序:先出後入
out.close();
in.close();
client.close();
}
public class ChatServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(9998);
ExecutorService pool = Executors.newCachedThreadPool();
while (true) {
Socket client = server.accept();
pool.submit(new ClientHandler(client));
}
}
}
class ClientHandler implements Runnable {
private Socket socket;
ClientHandler(Socket s) { socket = s; }
public void run() {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
String msg;
while ((msg = in.readLine()) != null) {
broadcast(msg); // 廣播給所有客戶端
}
} catch (IOException e) {
// 連線斷開
}
}
}
BufferedReader + PrintWriter 處理行導向協定PrintWriter(..., true) 確保即時發送Socket socket = new Socket("localhost", 9998);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 發送
out.println("Hello Server");
// 接收
String reply = in.readLine();