ObjectStream Crashes - java, sockets, stream

Сьогодні у мене виникла проблема з ObjectStream (введенням, а також виходом). Я використовував вхідний і вихідний потоки, які вийшли безпосередньо з розетки.

Під час ініціалізації потоків мій бігає, бігає та бігає. Без повідомлення про помилку. Я не отримав повідомлення про помилку. Здається, що конструктор ObjectInputStream працює без кінця ...

Ось код, в якому проблема існує. socket.isConnected було правдою.

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

Будь-які ідеї?

Відповіді:

0 для відповіді № 1

Потік вхідного об'єкта зчитує заголовок, який надсилається потіком вихідного об'єкта, який він побудований. Якщо ви не надсилаєте заголовок, він буде чекати назавжди.

Простим рішенням є спочатку створення вихідного потоку об'єктів та його промивання перед створенням потоку вводу об'єкта.


0 для відповіді № 2

Я знайшов це

Створіть ObjectOutputStream доObjectInputStream Якщо ви пишете код, який передає дані двонаправлено, використовуючи ObjectInputStream та ObjectOutputStream, обережно створіть ObjectOutputStream спочатку.

Якщо ви замість цього створите ObjectInputStreamПо-перше, обидва кінці блокуватимуть і в кінцевому підсумку вийдуть з ладу в конструкторі Це відбувається тому, що конструктор вхідного потоку чекає вихідний рядок байтів, щоб отримати з ObjectOutputStream open (). У односпрямованому випадку, коли одна сторона пише, а інша читає, все йде гладко. Однак у двонаправленому випадку, якщо обидві сторони намагаються спочатку побудувати вхідний потік, обидва чекають іншого, щоб побудувати вихідний потік, і ніхто не може продовжувати.

Якщо обробка виключень дозволяє спілкуватисящоб продовжити після створення вхідного потоку не вдається, то симптоми цієї проблеми полягають в тому, що обидві сторони блокують протягом певного періоду часу, одержують виняток і продовжують будувати ObjectOutputStream. Інший кінець потім може побудувати свій ObjectInputStream, так як послідовність ініціалізації тільки що прибула.

На щастя, виправлення є простим. Перемістіть створення ObjectOutputStream до об'єкта ObjectInputStream. Тоді кожен кінець передає послідовність ініціалізації, перш ніж намагатись відкрити його поточний вхід. Послідовність ініціалізації готова і очікує, так що побудова потоку вхідного сигналу йде нормально, і передача об'єктів може розпочатися без будь-якої затримки.