Использование ObjectInputStream и ObjectOutputStream между клиентским и серверным процессом - PullRequest
2 голосов
/ 26 декабря 2011

Я разрабатываю клиент-серверное 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 все идет правильно!

1 Ответ

10 голосов
/ 26 декабря 2011

Вы должны вызвать flush () в потоке на стороне клиента для фактической отправки данных (если буфер сокета не заполнен). Вы видите, что ваша программа зависает, потому что клиент не отправляет данные, а сервер блокирует данные, ожидая данных, которые никогда не будут получены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...