在客户端和服务器进程之间使用ObjectInputStream和ObjectOutputStream

sah*_*har 2 java sockets inputstream outputstream

我开发了一个客户端 - 服务器java应用程序,我使用ObjectOutputStream和ObjectInputStream在客户端和服务器进程之间发送和接收数据.我需要发送数组或对象或原始数据,但当我使用ObjectOutputStream和ObjectInputStream发送和接收原始值(writeDouble(),readDouble(),writeUTF(),readUTF())时出现问题.该计划暂停并停止工作.为什么,问题是什么?

这些是我程序的一部分

// client program

    ObjectOutputStream toServer;
    ObjectInputStream fromServer;

// Establish connection with the server
            Socket socket = new Socket(host, 7000);

            // Create an output stream to the server
            toServer = new ObjectOutputStream(socket.getOutputStream());
            fromServer = new ObjectInputStream(socket.getInputStream());

double num1 = Double.parseDouble(jtf1.getText().trim());
                    double num2 = Double.parseDouble(jtf2.getText().trim());
                    try {
                        toServer.writeUTF("multiply");
                        toServer.writeDouble(num1);
                        toServer.writeDouble(num2);
                        double result = fromServer.readDouble();
                        res.setText(String.valueOf(result));
                    } catch (IOException ex) {
                        System.err.println(ex);
                    }

// server program

private ObjectOutputStream outputToClient;
    private ObjectInputStream inputFromClient;

// Create a server socket
            ServerSocket serverSocket = new ServerSocket(7000);

while (true) {
                // Listen for a new connection request
                Socket socket = serverSocket.accept();
                System.out.println("connect ");
                outputToClient = new ObjectOutputStream(socket.getOutputStream());
                // Create an input stream from the socket
                inputFromClient =
                        new ObjectInputStream(socket.getInputStream());
                while(true)  {
                // Read from input
                String command = inputFromClient.readUTF();
                System.out.println("receive command");
                checkRequest(command);
                }
                // Write to the file
                //outputToFile.writeObject(object);

            }

public void checkRequest(String cmd){
        //Object o = null;
        try{
        if(cmd.equals(MULTIBLY)){
            double x = inputFromClient.readDouble();
            double y = inputFromClient.readDouble();
            double result = x*y;
            outputToClient.writeDouble(result);
            System.out.println("send result");
        }else if (cmd.equals(DIVIDE)){
            int x = inputFromClient.readInt();
            int result = 1000/x;
            outputToClient.writeDouble(result);
        }
        } catch(IOException io){

        }
    }
Run Code Online (Sandbox Code Playgroud)

当我将ObjectOutputstream和ObjectInputStream更改为DataOutputStream和DataInputStream时,每件事情都正确!

Oli*_*ier 10

您必须在客户端的流上调用flush()来实际发送数据(如果套接字的缓冲区未满).您看到您的程序挂起,因为客户端不发送数据,服务器正在阻塞,等待永远不会发生的数据.