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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:30