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

Java TCP Socket两数相加程序报错求助:NumberFormatException

问题分析与修复

客户端的核心错误

  1. 连接目标错误:你当前连接的是www.google.com的80端口,而服务器是在本地1080端口监听,客户端应连接本地服务器地址(localhost或127.0.0.1)和1080端口。
  2. 发送无关HTTP请求:代码中写入的"Get /search?q=java HTTP/1.1\n\n"是HTTP协议内容,和自定义TCP通信逻辑完全无关,这就是服务器抛出NumberFormatException的直接原因——服务器尝试读取数字时,收到的却是HTTP字符串,无法转换为整数。
  3. 未发送用户输入的数字:代码获取了用户输入的x和y,但没有将这两个数字写入输出流发送给服务器。
  4. 未读取服务器返回结果:客户端没有处理服务器返回的求和结果,无法展示最终计算值。

修正后的客户端代码

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 1080);
             BufferedReader bis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream())) {
            Scanner input = new Scanner(System.in);
            System.out.println("Insert number x.");
            int x = input.nextInt();
            System.out.println("Insert number y.");
            int y = input.nextInt();

            // 将数字按行发送(服务器用readLine读取,需加换行符作为结束标记)
            bos.write((x + "\n").getBytes());
            bos.write((y + "\n").getBytes());
            bos.flush();

            // 读取并展示服务器返回的结果
            String result = bis.readLine();
            System.out.println(result);

        } catch (IOException exc) {
            System.out.println(exc.getMessage());
        }
    }
}

服务器的小优化

服务器写完响应后需调用bos.flush(),否则数据可能留在缓冲区,客户端无法及时接收结果:

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        System.out.println("Listening.");
        try (ServerSocket server = new ServerSocket(1080);
             Socket s = server.accept();
             BufferedReader bis = new BufferedReader(new InputStreamReader(s.getInputStream()));
             BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream())) {
            System.out.println("Connected.");
            int x = Integer.parseInt(bis.readLine());
            int y = Integer.parseInt(bis.readLine());
            int z = x + y;
            bos.write(("The amount is:" + z + "\n").getBytes()); // 加换行符,方便客户端readLine读取
            bos.flush(); // 刷新缓冲区,确保数据发送给客户端
        } catch (IOException exc) {
            System.out.println(exc.getMessage());
        }
    }
}

运行步骤

  1. 先启动服务器,控制台输出Listening.
  2. 启动客户端,按提示输入两个数字
  3. 客户端会展示服务器返回的求和结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:17:23