调试简单客户端服务器程序:客户端Scanner无法读取输入问题
问题分析与修复
你的客户端输入无响应的核心原因是程序卡在了服务器消息读取步骤,根本没执行到读取用户输入的代码:
客户端启动后第一行就调用了System.out.println(input.readLine());,但服务器的ClientHandler并没有先发送任何初始消息,而是直接进入循环发送"Would you like to play?"。这会导致客户端一直阻塞在input.readLine(),等待服务器的消息,永远到不了playing = scanner.nextLine()这一步,自然无法读取你的输入。
另外还有两个冗余问题:
- 服务器
ClientHandler里的Scanner scanner = new Scanner(System.in);完全没用,服务器不需要读取控制台输入,应该删除 - 客户端循环内的消息交互顺序需要和服务器严格匹配,避免再次出现阻塞
修复后的代码
客户端(Client)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Random; import java.util.Scanner; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket server = new Socket("localhost", 3300); Scanner scanner = new Scanner(System.in); BufferedReader input; PrintWriter output; int clientDice; int serverDice; try { input = new BufferedReader(new InputStreamReader(server.getInputStream())); output = new PrintWriter(server.getOutputStream(), true); String playing = "play"; while ("play".equals(playing)) { // 读取服务器的提问消息 System.out.println(input.readLine()); // 读取用户输入 playing = scanner.nextLine(); // 发送给服务器 output.println(playing); if ("play".equals(playing)) { // 读取服务器发送的骰子数 serverDice = Integer.parseInt(input.readLine()); clientDice = new Random().nextInt(6) + 1; // 修正:骰子范围改为1-6 System.out.println("Client rolled " + clientDice + ". Server rolled " + serverDice); } else { playing = "exit"; } } server.close(); } catch (IOException e1) { e1.printStackTrace(); } } }
服务器处理器(ClientHandler)
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Random; public class ClientHandler implements Runnable { public Socket client; public ClientHandler(Socket client) { this.client = client; } public void run() { BufferedReader input; PrintWriter output; int serverDice; try { input = new BufferedReader(new InputStreamReader(client.getInputStream())); output = new PrintWriter(client.getOutputStream(), true); System.out.println("New client connected"); System.out.println("Server is ready to play"); String playing = "play"; while ("play".equals(playing)) { output.println("Would you like to play?"); playing = input.readLine(); if ("play".equals(playing)) { // 修正:骰子范围改为1-6 output.println(new Random().nextInt(6) + 1); } } client.close(); } catch (IOException e1) { e1.printStackTrace(); } } }
额外优化说明
- 修正了骰子范围:原代码
nextInt(6)生成0-5的数,改成nextInt(6)+1才是标准的1-6骰子点数 - 移除了所有冗余代码,确保客户端和服务器的消息交互顺序完全匹配:服务器发提问→客户端输入→客户端发送→服务器发骰子数→客户端读取展示
内容的提问来源于stack exchange,提问作者hunz
相关产品推荐
相关产品推荐

