В 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
мне не поможет.