Java TCP Socket两数相加程序报错求助:NumberFormatException
问题分析与修复
客户端的核心错误
- 连接目标错误:你当前连接的是
www.google.com的80端口,而服务器是在本地1080端口监听,客户端应连接本地服务器地址(localhost或127.0.0.1)和1080端口。 - 发送无关HTTP请求:代码中写入的
"Get /search?q=java HTTP/1.1\n\n"是HTTP协议内容,和自定义TCP通信逻辑完全无关,这就是服务器抛出NumberFormatException的直接原因——服务器尝试读取数字时,收到的却是HTTP字符串,无法转换为整数。 - 未发送用户输入的数字:代码获取了用户输入的x和y,但没有将这两个数字写入输出流发送给服务器。
- 未读取服务器返回结果:客户端没有处理服务器返回的求和结果,无法展示最终计算值。
修正后的客户端代码
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()); } } }
运行步骤
- 先启动服务器,控制台输出
Listening. - 启动客户端,按提示输入两个数字
- 客户端会展示服务器返回的求和结果
内容的提问来源于stack exchange,提问作者Mary Heidi
相关产品推荐
相关产品推荐

