遊戲規則
- 伺服器產生 0-99 隨機數
- 客戶端有 3 次猜測機會
- 伺服器提示「大了/小了/正確」
- 每連線一局,支援多客戶端並發
伺服器端完整程式碼
public class GuessNumberServer {
static final int PORT = 9000;
public static void main(String[] args) throws IOException {
try (ServerSocket server = new ServerSocket(PORT)) {
System.out.println("伺服器啟動,監聽埠 " + PORT);
ExecutorService pool = Executors.newCachedThreadPool();
while (true) {
Socket client = server.accept();
pool.submit(new GameSession(client));
}
}
}
}
class GameSession implements Runnable {
private final Socket socket;
GameSession(Socket s) { socket = s; }
public void run() {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
int answer = new Random().nextInt(100);
System.out.println(socket.getInetAddress() + " 開始遊戲,答案: " + answer);
for (int attempt = 3; attempt > 0; attempt--) {
out.println("請猜 0-99 之間的數字 (剩餘 " + attempt + " 次):");
String line = in.readLine();
if (line == null) return; // 客戶端斷線
try {
int guess = Integer.parseInt(line.trim());
if (guess == answer) {
out.println("恭喜猜對了!答案是 " + answer);
return;
} else if (guess < answer) {
out.println("太小了!");
} else {
out.println("太大了!");
}
} catch (NumberFormatException e) {
out.println("請輸入有效數字");
attempt++; // 不扣次數
}
}
out.println("機會用盡,正確答案是 " + answer);
} catch (IOException e) {
// 連線異常
} finally {
System.out.println("遊戲結束: " + socket.getInetAddress());
}
}
}
客戶端完整程式碼
public class GuessNumberClient {
public static void main(String[] args) throws IOException {
String host = args.length > 0 ? args[0] : "localhost";
int port = args.length > 1 ? Integer.parseInt(args[1]) : 9000;
try (Socket socket = new Socket(host, port);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader console = new BufferedReader(
new InputStreamReader(System.in))) {
System.out.println("已連線至伺服器");
String serverMsg;
while ((serverMsg = in.readLine()) != null) {
System.out.println("伺服器: " + serverMsg);
if (serverMsg.contains("猜對") || serverMsg.contains("機會用盡")) break;
System.out.print("你的猜測: ");
String guess = console.readLine();
if (guess == null) break;
out.println(guess);
}
}
}
}
執行方式
# 終端機 1: 啟動伺服器
java GuessNumberServer
# 終端機 2, 3...: 多客戶端並發測試
java GuessNumberClient localhost 9000
關鍵設計亮點
- 執行緒池隔離:每局遊戲獨立執行緒,互不阻塞
- 資源自動管理:try-with-resources 保證關閉
- 輸入驗證:捕獲 NumberFormatException,不扣機會
- 協定簡潔:行導向文字,Telnet 可直接測試
- 隨機種子:每局獨立 Random 實例