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

标签 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){

        }
    }

当我将 ObjectOutputstream 和 ObjectInputStream 更改为 DataOutputStream 时 和 DataInputStream 一切顺利!

最佳答案

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

关于java - 在客户端和服务器进程之间使用ObjectInputStream和ObjectOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637405/

相关文章:

java - 读取输入流

java - 如何将 Java OutputStream 上传到 AWS S3

android - 将输入流转换为文件android

java - 条纹注入(inject)丰富器 : can't connect to ejb module

java - 在java中将SO_LINGER套接字选项设置为ServerSocket

Java日期时间问题

java - 多线程 Java Web 服务器中的内存泄漏

java - 使用纯 Java 与 SSH 服务器通信以进行文件访问

java - Springboot @ServerEndPoint "Failed to find the root WebApplicationContext."

java - 使用 "webdriver.firefox.marionette"时由 : java. lang.NullPointerException 引起的 UnreachableBrowserException