У меня есть клиент Java (1.6b17 в Windows XP, запущенный через веб-запуск Java), который использует сокет TCP для запроса сервера на основе Java через соединение ADSL. В сокете клиента установлено время ожидания (3000 мс).
Иногда (и до сих пор не воспроизводимо) клиент останавливается при чтении ответов с сервера. Существует несколько сотен установок, и большинство пользователей не сталкиваются с проблемой большую часть времени.
Клиент создает новый сокет для каждого запроса, выполнив следующие шаги:
- Создайте новый сокет, установив время ожидания 3000 мс
- Отправить запрос (одна строка текста)
- Чтение нескольких строк ответа, закрытие сокета при получении специальной последовательности «конец сообщения» (или ноль)
Вот некоторый (упрощенный) код для иллюстрации:
socket = new Socket(host, port);
socket.setSoTimeout(socketTimeout);
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socket.write(cmd);
while (true) {
line = in.readLine();
if (line == null) break;
if (line.equals("EOL")) break;
// Store line of text in an ArrayList
}
socket.close();
Проблема в том, что иногда, в середине приема, клиент делает паузу до 5 минут, а затем возобновляет работу без какого-либо вмешательства. После этого приложение возобновляет работу без заметных проблем с производительностью.
Регистрация на стороне сервера указывает, что операция занимает около 150 мс, хотя соответствующая временная метка берется до закрытия сокета (что я попытаюсь рассмотреть).
Одно из моих рабочих предположений заключается в том, что это не связано с сетевыми проблемами, так как в противном случае readLine истекло бы, это допустимое предположение?
Также маловероятно, что это будет связано со сборкой мусора. Приложению выделено 512 МБ кучи, а извлекаемые данные состоят из 1600 строк по 100 символов. Я ожидаю, что если проблема, связанная с ГХ или утечками памяти, приведет к общему ухудшению производительности, а не к «залипающему» поведению, которое я вижу, это правильно?
Будем весьма благодарны за любые предложенные стратегии для устранения неполадок.
Спасибо,
Фил