Установка ограничения времени ожидания для readLine()?

#java #sockets #pop3

#java #сокеты #pop3

Вопрос:

У меня есть следующий код, который считывает ответ с POP-сервера через сокеты в Java. Но проблема иногда заключается в том, что когда я использую функцию readLine() для чтения с сервера, и если сервер не отвечает никаким ответом, мое приложение зависает там, ожидая ответа от сервера.

 socket.connect(new InetSocketAddress("pop.server.com", 110), 3000);
input = socket.getInputStream();
BufferedReader incoming = new BufferedReader(new InputStreamReader(input));
incoming.readLine();   //This line will cause my application to hang if the server does not respond with a reply
 

Есть ли способ установить тайм-аут или какие-либо другие способы, чтобы, когда сервер не отвечает через определенное время, приложение должно перестать ждать ответа и продолжить другое выполнение?

Комментарии:

1. Почему вы не используете Javamail?

Ответ №1:

Я предлагаю вам попробовать Socket.setSoTime(тайм-аут)

Комментарии:

1. Однако это не приводит к таймауту при чтении всей строки. Что, если клиент продолжает отправлять байты, но никогда не заканчивает строку??

2. @grom Это риск. Клиент всегда может отправить вам бесконечные данные, которые вызывают ошибку нехватки памяти. Если вам нужна пользовательская обработка, вы должны написать код самостоятельно.

3. @grom Вы можете использовать Read() в своем собственном цикле while. Этот метод считывает только один символ. Если вы объедините это с таймаутом, вы сможете делать то, что хотите. Не совсем то же самое, что «написать код самостоятельно» 🙂