Java Socket计算器加法正常但减法、乘法计算结果异常求助
问题分析与解决方案
问题根源
你遇到的错误是因为InputStream.read()和OutputStream.write()仅处理单个字节(取值范围0-255):
- 当计算结果超出该范围时,会被自动截断为低8位的无符号数值:
- 乘法51020=1000,1000 % 256 = 232,对应你得到的错误结果;
- 减法5-10-20=-25,转换为无符号字节是256-25=231,匹配你的减法错误;
- 加法5+10+20=35在0-255区间内,所以结果正常。
修复方案
使用DataInputStream和DataOutputStream来读写完整的int类型(4字节),确保整数不会被截断。
修改后的服务器代码
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { ServerSocket server = new ServerSocket(10); Server() throws IOException { while (true) { Socket client = server.accept(); DataInputStream input = new DataInputStream(client.getInputStream()); DataOutputStream output = new DataOutputStream(client.getOutputStream()); int op = input.readInt(); int num1 = input.readInt(); int num2 = input.readInt(); int num3 = input.readInt(); int result = 0; switch(op) { case 0: result = num1 + num2 + num3; break; case 1: result = num1 - num2 - num3; break; case 2: result = num1 * num2 * num3; break; } output.writeInt(result); output.flush(); input.close(); output.close(); client.close(); } } public static void main(String[] args) { try { new Server(); } catch (IOException e) { e.printStackTrace(); } } }
修改后的客户端代码
import java.io.*; import java.net.Socket; public class Client { Client() throws IOException { Socket server = new Socket("localhost", 10); DataInputStream input = new DataInputStream(server.getInputStream()); DataOutputStream output = new DataOutputStream(server.getOutputStream()); // 发送操作符2(乘法) output.writeInt(2); output.writeInt(5); output.writeInt(10); output.writeInt(20); output.flush(); System.out.println("计算结果:" + input.readInt()); input.close(); output.close(); server.close(); } public static void main(String[] args) { try { new Client(); } catch (IOException e) { e.printStackTrace(); } } }
额外说明
- 修正了类名不规范问题:原代码中
server类名改为Server,符合Java大驼峰命名规则; - 操作完成后显式关闭Socket连接,避免资源泄漏;
DataInputStream/DataOutputStream可安全传输任意范围的int值,彻底解决数值截断问题。
内容的提问来源于stack exchange,提问作者codingkappa
相关产品推荐
相关产品推荐

