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

Java客户端/服务端程序:整数转String实现斐波那契结果返回问题

解决Java Socket服务端斐波那契计算中的类型转换与逻辑问题

问题核心

需要将客户端输入的数值字符串转换为int类型传入斐波那契计算方法,同时修正斐波那契逻辑以匹配预期结果(输入2返回3),并处理字符串转换中的异常情况。

修正后的服务端代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class ServerData {
    // 调整斐波那契逻辑以匹配预期:输入n返回对应规则的结果(如输入2返回3)
    public static int fibonacci(int n) {
        int v1 = 1, v2 = 2, v3 = 0;
        if (n == 0) return 1;
        if (n == 1) return 2;
        for(int i = 2; i <= n; i++) {
            v3 = v1 + v2;
            v1 = v2;
            v2 = v3;
        }
        return v3;
    }

    public static void main(String[] args) {
        ServerSocket server = null;
        boolean shutdown = false;
        try {
            server = new ServerSocket(1236);
            System.out.println("Port bound. Accepting connection");
        } catch(IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        while(!shutdown) {
            Socket client = null;
            InputStream input = null;
            OutputStream output = null;
            try {
                client = server.accept();
                input = client.getInputStream();
                output = client.getOutputStream();
                
                // 读取客户端发送的内容长度与数据
                int dataLen = input.read();
                byte[] data = new byte[dataLen];
                input.read(data);
                
                // 处理输入字符串:去除换行符并修剪空白(String不可变,需重新赋值)
                String clientInput = new String(data, StandardCharsets.UTF_8).replace("\n", "").trim();
                System.out.println("Client said: " + clientInput);
                
                String response;
                if (clientInput.equalsIgnoreCase("shutdown")) {
                    response = "Shutting down server...";
                    shutdown = true;
                } else {
                    try {
                        // 将字符串转换为int并计算斐波那契结果
                        int num = Integer.parseInt(clientInput);
                        int fibResult = fibonacci(num);
                        response = String.format("Fibonacci result for input %d is: %d", num, fibResult);
                    } catch (NumberFormatException e) {
                        // 处理非数字输入的异常情况
                        response = "Error: Please input a valid integer number";
                    }
                }
                
                // 发送响应给客户端
                output.write(response.length());
                output.write(response.getBytes(StandardCharsets.UTF_8));
                
                client.close();
                if(shutdown) {
                    System.out.println("shutting down...");
                }
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }
}

修正后的客户端代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class ClientData {
    public static void main(String[] args) {
        System.out.print("Input a number for Fibonacci calculation (or 'shutdown' to stop server): ");
        
        BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
        try {
            String userString = userInput.readLine();
            
            Socket connection = new Socket("127.0.0.1", 1236);
            InputStream input = connection.getInputStream();
            OutputStream output = connection.getOutputStream();
            
            // 发送输入内容给服务端
            output.write(userString.length());
            output.write(userString.getBytes(StandardCharsets.UTF_8));
            
            // 读取服务端响应
            int responseLen = input.read();
            byte[] responseData = new byte[responseLen];
            input.read(responseData);
            String serverResponse = new String(responseData, StandardCharsets.UTF_8);
            
            System.out.println("Server said: " + serverResponse);
            
            connection.close(); 
        } catch (IOException e ) {
            e.printStackTrace();
        }
    }
}

关键修正说明

  • 类型转换处理:用Integer.parseInt()实现字符串转int,添加NumberFormatException捕获非数字输入的异常,避免程序崩溃。
  • 斐波那契逻辑调整:修改初始值为v1=1, v2=2,确保输入2时返回3,匹配你指定的序列规则。
  • 字符串处理:由于String是不可变类型,必须将replace()的结果重新赋值给变量,同时用trim()处理输入前后的空白字符。
  • 异常友好提示:对非数字输入返回明确错误信息,提升交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:16:04