首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多執行緒 Socket 猜數字遊戲:伺服器/客戶端完整實作

     編輯:Java 相關知識

遊戲規則

  • 伺服器產生 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 實例
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved