Сработает ли установка таймаута для сокета, если вы читаете полную строку, используя буферизованный ридер? - PullRequest
4 голосов
/ 25 октября 2011

Я пишу сокет-клиент, который отправляет строку через сокет-соединение, а затем ждет до 45 секунд, пока линия не вернется с сервера.

Я использую буферизованный ридер так:

Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
            socket = new Socket(host, 800);
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                                        socket.getInputStream()));
} catch (UnknownHostException e) {
            listener.failedToConnectToHost(e);
            return;
} catch (IOException e) {
            listener.failedToConnectToHost(e);
        return;
}

        BufferedReader stdIn = new BufferedReader(
                new InputStreamReader(System.in));
        out.println("message");
try {
        String response = in.readLine();
        listener.responseRecived(response);
        return;
} catch (IOException e) {
        listener.errorReadingResponse(e);
        return;
}

Если я добавлю следующую строку (или что-то подобное)

socket.setSoTimeout(45000);

Что произойдет через 45 секунд, если предположить, что с другого конца ничего не прошло?

Я предполагаю, что поймаю прерванное исключение, но я уверен?

Будет ли это вообще работать? Документы для setSOTImeOut () подразумевают, что истекает время ожидания для socket.read (), я предполагаю, что буферизованный читатель вызывает это где-то в стеке, но предположение является матерью всех ошибок, поэтому я просто хотел проверить.

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Метод BufferedReader.readLine() выдаст SocketTimeoutException через 45 секунд.

0 голосов
/ 25 октября 2011

Очевидно, это работает, и вы получаете исключение SocketTimeoutException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...