You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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捕获,处理用户输入非数字的情况,返回友好提示。
  • 资源管理:确保所有流和套接字资源在程序结束后正确关闭,避免资源泄漏。

运行步骤

  1. 先启动Server类,控制台会显示"Server Signing On"并等待客户端连接。
  2. 启动Client类,按照提示输入数字或"end"。
  3. 输入数字后会收到服务器返回的乘法表;输入"end"后,服务器停止响应,客户端自动退出。

内容的提问来源于stack exchange,提问作者Geek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:02:32