Java客户端-服务器架构问题:无法接收数字的代码修复建议
修复客户端-服务器乘法表功能的代码方案
看起来你遇到的核心问题是服务器没有正确读取客户端的输入内容,导致无法处理数字请求。我帮你完善了服务器代码,同时配套了一个可用的客户端代码,确保端到端功能正常运行:
完整修改后的服务器代码
package p1; import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws Exception { System.out.println("Server Signing On"); // 监听8888端口,可根据需求修改 ServerSocket serverSocket = new ServerSocket(8888); // 等待客户端发起连接 Socket clientSocket = serverSocket.accept(); System.out.println("客户端已连接"); // 初始化输入输出流,用于和客户端通信 BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter( clientSocket.getOutputStream(), true); String inputLine; // 持续监听客户端输入 while ((inputLine = in.readLine()) != null) { // 判断是否收到结束指令,不区分大小写更友好 if ("end".equalsIgnoreCase(inputLine)) { System.out.println("客户端请求结束,服务器关闭"); out.println("服务器已停止响应"); break; } try { // 将输入转为整数,生成乘法表 int num = Integer.parseInt(inputLine); StringBuilder multiplicationTable = new StringBuilder(); multiplicationTable.append(num).append("的乘法表:\n"); for (int i = 1; i <= 10; i++) { multiplicationTable.append(num).append(" × ").append(i) .append(" = ").append(num * i).append("\n"); } // 将乘法表发送给客户端 out.println(multiplicationTable.toString()); } catch (NumberFormatException e) { // 处理非数字输入,给用户提示 out.println("请输入有效的数字或'end'结束"); } } // 关闭所有资源,避免泄漏 in.close(); out.close(); clientSocket.close(); serverSocket.close(); } }
配套客户端代码
import java.io.*; import java.net.*; import java.util.Scanner; public class Client { public static void main(String[] args) throws Exception { // 连接本地服务器,端口需和服务器保持一致 Socket socket = new Socket("localhost", 8888); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter( socket.getOutputStream(), true); Scanner scanner = new Scanner(System.in); System.out.println("已连接服务器,请输入数字获取乘法表,输入'end'停止"); String userInput; while (true) { userInput = scanner.nextLine(); out.println(userInput); // 读取服务器返回的响应 String response = in.readLine(); System.out.println("\n服务器响应:\n" + response); // 收到结束提示后退出循环 if ("服务器已停止响应".equals(response)) { break; } } // 关闭客户端资源 scanner.close(); in.close(); out.close(); socket.close(); } }
关键修复点说明
- 补全输入读取逻辑:原代码缺失了从客户端读取输入的核心步骤,这里用
BufferedReader实现了逐行读取客户端发送的内容。 - 指令判断与循环控制:通过
while循环持续监听客户端输入,收到"end"指令时终止连接并关闭服务器。 - 异常处理:添加了
NumberFormatException捕获,处理用户输入非数字的情况,返回友好提示。 - 资源管理:确保所有流和套接字资源在程序结束后正确关闭,避免资源泄漏。
运行步骤
- 先启动
Server类,控制台会显示"Server Signing On"并等待客户端连接。 - 启动
Client类,按照提示输入数字或"end"。 - 输入数字后会收到服务器返回的乘法表;输入"end"后,服务器停止响应,客户端自动退出。
内容的提问来源于stack exchange,提问作者Geek
相关产品推荐
相关产品推荐

