Java Socket 计算器减法和乘法不起作用,但加法起作用

问题描述 投票:0回答:2

我的代码中的问题是减法和乘法不起作用,但加法工作正常...我至少得到一个结果,但是数字完全错误,因此将 3 个数字相乘得到 232。如果我更改运算符进行减法,结果是231。所以我猜它选择了错误的数字来计算? 我究竟做错了什么?或者是什么问题,为什么它不起作用?我尝试过调试,但它对我不起作用。

服务器:

public class server {

    ServerSocket server = new ServerSocket(10);

    server() throws IOException {
        while ( true ) {
            Socket client = server.accept();
            InputStream input = client.getInputStream () ;
            OutputStream output = client.getOutputStream () ;

            
            int op = input.read();
            
            int num1 = 0;
            int num2 = 0;
            int num3 = 0;
            
            num1 = input.read();
            num2 = input.read();
            num3 = input.read();
            
            switch(op) {
            case 0:
                output.write (num1 + num2 + num3);
                break;
            case 1:
                output.write (num1 - num2 - num3);
                break;
            case 2:
                output.write ((num1 * num2) * num3);
                break;
            }


            output.flush();
            input.close();
            output.close();
        }
    }

    public static void main (String[] args) {
        try {
            server server = new server() ;
        } catch (IOException e) {
            System.out.print(e);
        }
    }
}

客户代码:

public class Client {

    Client() throws IOException {
        Socket server = new Socket ("localhost", 10);
        InputStream input = server.getInputStream();
        OutputStream output = server.getOutputStream();
        
        output.write(2);
        
        output.write(5);
        output.write(10);
        output.write(20);
        
        output.flush();
        System.out.println(input.read());
        server.close();
        input.close();
        output.close();
    }

    public static void main (String[] args) {
        try {
            Client client = new Client();
        } catch (IOException e) {
            System.out.print(e);
        }
    }
}
java
2个回答
0
投票

我认为使用 DataInputStream 和 DataOutputStream 类通过流写入 int、chars 和 Java 基本数据类型会有所帮助。

这是服务器的代码示例。

import java.net.*;
import java.io.*;

public class Server {

    ServerSocket server = new ServerSocket(8080);

    Server() throws IOException {
        while (true) {
            Socket client = server.accept();
            DataInputStream input = new DataInputStream(new BufferedInputStream(client.getInputStream()));
            DataOutputStream output = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));

            int op = input.readInt();
            int num1 = input.readInt();
            int num2 = input.readInt();
            int num3 = input.readInt();

            switch (op) {
                case 0:
                    output.writeInt(num1 + num2 + num3);
                    output.flush();
                    break;
                case 1:
                    output.writeInt(num1 - num2 - num3);
                    output.flush();
                    break;
                case 2:
                    output.writeInt(num1 * num2 * num3);
                    output.flush();
                    break;
            }

            input.close();
            output.close();
            client.close();
        }
    }

    public static void main(String[] args) {
        try {
            Server server = new Server();
        } catch (IOException e) {
            System.out.print(e);
        }
    }
}

这是客户端的代码示例。

import java.net.*;
import java.io.*;

public class Client {

    Client() throws IOException {
        Socket socket = new Socket("localhost", 8080);
        DataInputStream input = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        DataOutputStream output = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

        output.writeInt(1);
        output.writeInt(5);
        output.writeInt(10);
        output.writeInt(20);
        output.flush();

        int response = input.readInt();
        System.out.println(response);

        input.close();
        output.close();
        socket.close();
    }

    public static void main(String[] args) {
        try {
            Client client = new Client();
        } catch (IOException e) {
            System.out.print(e);
        }
    }
}

现在我们可以将服务器作为后台进程运行,然后运行客户端。

% java Server.java &
% java Client.java
-25

您可以看到减法例程运行良好。

操作 5-10-20 返回 -25。

我认为 DataInputStream 和 DataOutputStream 类解决了很多可能发生但很难发现的问题。

例如,InputStream.read()方法无法读取负数,因为它返回0到255范围内的int。

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read()

从输入流中读取下一个数据字节。值字节是 以 0 到 255 范围内的 int 形式返回。如果没有可用字节 因为已经到达流的末尾,所以值 -1 是 回。该方法会阻塞,直到输入数据可用为止, 检测到流,或者抛出异常。

这就是 DataInputStream 和 DataOutputStream 让跨流编写原语变得更容易的原因之一。

我使用示例中的代码测试了加法、减法和乘法例程。

该代码适用于所有三种情况。每个例程都会给出正确的结果。


0
投票

OutputStream.write(int b)
InputStream.read()
发送/接收单个字节。一个字节只能保存 0 到 255 之间的值,而 5 * 10 * 20 = 1000。您必须将每个值作为几个字节发送。

© www.soinside.com 2019 - 2024. All rights reserved.