java.net.SocketTimeoutException: тайм-аут чтения - PullRequest
8 голосов
/ 20 марта 2010

У меня есть приложение с архитектурой клиент-сервер. Клиент используйте Java Web Start с Java Swing / AWT, а сервер использует HTTP-сервер / сервлет с Кот. Сообщение сделано из сериализации объектов, создать ObjectOutput сериализует байтовый массив и отправляет на сервер соответственно вызывается ObjectInputStream и десериализуется.

Приложение следует для правильного общения с определенным время параллелизма, когда начало показывать ошибку Msgstr "Тайм-аут чтения SocketException". Ошибка возникает, когда сервер вызывает метод ObjectInputStream.getObject () в моем методе doPost сервлета.

Tomcat будет работать медленно, и ошибки начнут уменьшать время отклика сервера до момента сбоя, когда я должен перезагрузить сервер и после того, как все заработает

Кто-то прошел через эту проблему?

Код клиента

URLConnection conn =  url.openConnection();
conn.setDoOutput(true);

OutputStream os = conn.getOutputStream();
ObjectOutputStream oss = new ObjectOutputStream(os);

oss.writeUTF("protocol header sample");

oss.writeObject(_parameters);
oss.flush();
oss.close();

Код сервера

ObjectInputStream input = new ObjectInputStream(_request.getInputStream());
String method = input.readUTF();

parameters = input.readObject();

input.readObject () - это место, где ошибка

Ответы [ 2 ]

10 голосов
/ 20 марта 2010

Вы не дали нам много информации, особенно о клиентской части. Но я подозреваю, что на стороне клиента:

  • не удалось установить заголовок Content-length (или установить для него неправильное значение),
  • не удалось очистить выходной поток и / или
  • не закрывает выходную сторону розетки.

Mysterious.

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

  • По какой-то причине клиентская сторона либо полностью блокируется во время сериализации, либо занимает ОЧЕНЬ ДОЛГОЕ ВРЕМЯ.
  • Между клиентом и сервером существует прокси, вызывающий проблемы.
  • У вас проблемы с сетью, связанные с нагрузкой, или проблемы с сетевым оборудованием.

Другое возможное объяснение - утечка памяти и замедление вызвано тем, что сборщик мусора занимает все больше и больше времени, когда у вас заканчивается память. Это будет отображаться в журналах GC, если они у вас включены.

0 голосов
/ 29 августа 2012

Я думаю, что во время высокого параллелизма время ожидания сокета, установленное в Tomcat, истекло, и соединение закрыто. При следующем чтении Tomcat для этого соединения будет превышено время ожидания сокета сервера, указанное на сервере.
Если вы хотите избежать этой проблемы, вы должны увеличить время ожидания на стороне сервера, которое истекло в вашем случае. Но не рекомендуется.
Кстати, вы не дали достаточно информации. Вы увеличили количество потоков для подключения в Tomcat? Если бы вы это сделали, это наверняка произойдет.

...