【问题标题】:Using ObjectInputStream and ObjectOutputStream between client and server process在客户端和服务器进程之间使用 ObjectInputStream 和 ObjectOutputStream
【发布时间】:2012-01-28 01:46:13
【问题描述】:

我开发了一个客户端-服务器 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 一切正常!

【问题讨论】:

    标签: java sockets inputstream outputstream


    【解决方案1】:

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

    【讨论】:

    • 在发送数据和接收数据之前使用flush()?
    猜你喜欢
    • 2016-06-23
    • 2013-01-16
    • 2018-01-06
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多