0

Я пишу клиентское/серверное приложение, в котором сервер отправляет сериализуемые объекты клиенту через ObjectOutputStream (я буду называть его oos с этого момента), и клиент получает их с ObjectInputStream ("ois" впредь).Блокировка ObjectInputStream в readObject()

Теперь, поскольку сначала выполняется сервер, я сначала инициализирую oos. Как и должно быть. Вот как я инициализировать его:

OutputStream outStream=incoming.getOutputStream(); 
DataOutputStream outToClient=new DataOutputStream(outStream); 
outToClient.flush(); 
ObjectOutputStream oos = new ObjectOutputStream(outStream); 
oos.flush(); 

Затем я запустить клиент и я инициализировать OIS с этим строки:

inStream = clientSocket.getInputStream(); 
ObjectInputStream ois = new ObjectInputStream(inStream); 

С этого момента, на стороне сервера будет посылать множество объектов на том же потоке это путь:

oos.writeUnshared(wishes); 

в течение цикла. Проблема в том, что когда я выполняю этот проклятый код на моем компьютере, все в порядке. Никаких проблем. Когда я пытаюсь использовать две разные машины, появляется тупик. Клиентская сторона остается навечно на этой линии:

tempWishes = (ArrayList<String>) ois.readObject(); 

Не стесняйтесь спрашивать о более подробной информации. Я не разделял весь код клиента и сервера, потому что это как 500 строк кода.

+0

Вы уверены, что вы видели тупик, а не блокировку, что указывает на совершенно иную проблему? Если это действительно тупик, какие блокировки? – neurite

+0

Звучит как проблема буферизации. Перед записью объектов со стороны сервера убедитесь, что вы сбрасываете() или закрываете() 'oos'. –

+0

Уже используется flush(). Благодаря! – Andrew

ответ

0

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

Сообщите мне, если это исправлено.

+0

Спасибо, это частично помогло, так как проблема также была расширена до моего определения Socket. Теперь, еще более забавно, мое приложение работает правильно в режиме отладки, но дает ту же проблему моего вопроса во время простого запуска. – Andrew

+0

Это не исправит, и это хорошая практика, если вы хотите намеренно разрушить граф объектов. Вот почему это не по умолчанию. – EJP

1

Это выглядит подозрительно:

DataOutputStream outToClient=new DataOutputStream(outStream); 
ObjectOutputStream oos = new ObjectOutputStream(outStream); 

Оба outToClient и oos Обращаемся к одной и той же основной поток. Это может вызвать странность.

@ предложение EJP, что вы удалите DataOutputStream является хорошим, потому что DataOutputStream класс не то, что вы после этого (так как вы пишете объекты), и вы почти наверняка хотите единую цепь OutputStream с.

+0

Поскольку мне нужно отправлять объекты в определенных случаях, я думал об использовании DataOutputStream для отправки клиенту сообщения: «то, что вы получите дальше, это объект» или «то, что вы получите дальше, это строка». Во втором случае я просто продолжаю использовать DataOutputStream, в то время как в первом клиент начинает ожидание объекта с помощью метода readObject(). Теперь изменено в readUnshared(). Думаю, этот способ мышления был неправильным. – Andrew

+1

'ObjectOutputStream' реализует интерфейс DataOutput, поэтому вы можете использовать один объект ObjectOutputStream для обеих ролей. –

Смежные вопросы