Блок Java Socket ObjectInputStream - PullRequest
       2

Блок Java Socket ObjectInputStream

0 голосов
/ 06 декабря 2018

В Java Object Serialization необходимо создать ObjectOutputStream до ObjectInputStream как на стороне сервера, так и на стороне клиента, что я и сделал, но клиент будет работать, пока не дойдет до того, что ему придется ждать данных отсервер (выведите сообщение «Готово 3», затем подождите), а на стороне сервера код выполняется только до тех пор, пока не дойдет до момента, когда клиент первым прочитает (напечатайте «Готово 1», затем подождите).Что еще мне нужно сделать, кроме создания ObjectOutputStream до ObjectInputStream?Из всех поисков, которые я видел, все они упоминают порядок создания объекта, и в одном случае они сказали очистить вывод сразу после его создания (как в примере 1), но это тоже не сработало.

Example1

ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
dataOut.flush();
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());

Сервер

@Override
public void run() {
    try {
        serverSocket = new ServerSocket(4554);
        serverRunning = true;
        while (serverRunning) {
            socket = serverSocket.accept();
            ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
            System.out.println("Done 1");

            String string = dataIn.readUTF();
            System.out.println("Done 2");

            int number = dataIn.readInt();
            System.out.println("Done 3");

            dataOut.writeUTF("String from server");
            System.out.println("Done 4");

            dataOut.writeInt(1);
            System.out.println("Done 5");

            System.out.println(string + " | " + number);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Клиент

    Socket socket = new Socket("localhost", 4554);
    ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
    ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
    System.out.println("Done 1");

    dataOut.writeUTF("String from client");
    System.out.println("Done 2");

    dataOut.writeInt(2);
    System.out.println("Done 3");

    String string = dataIn.readUTF();
    System.out.println("Done 4");

    int number = dataIn.readInt();
    System.out.println("Done 5");

    socket.close();
    System.out.println(string + " | " + number);

// Редактировать: Итак, если я буду менять каждый writeUTF() writeInt()на writeObject(), также изменяйте каждые readUTF() readInt() на readObject() (добавляя соответствующее приведение для String и int), проблема устраняется на стороне сервера и клиента.Но я не понимаю, почему это так, есть ли объяснение этому поведению и исправление?Я бы использовал DataOuput/InputStream, но мне тоже нужно отправлять / получать объекты, поэтому DataOuput/InputStream мне не поможет.

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