установка времени ожидания для переменной InputStreamreader - PullRequest
0 голосов
/ 20 мая 2010

У меня работает сервер, который принимает соединения, сделанные через клиентские сокеты, мне нужно прочитать входные данные из этого клиентского сокета, теперь предположим, что клиент открыл соединение с моим сервером, не отправляя ничего через выходной поток сокета сервера, в данном случае, В то время как мой сервер пытался прочитать входные данные через входной поток клиентского сокета, будет сгенерировано исключение, но, прежде чем сгенерировать исключение, я хотел бы сказать, что время ожидания составляет 5 секунд, как я могу это сделать? в настоящее время вот как мой код выглядит на стороне сервера:

try 
    {
        InputStreamReader clientInputStream = new InputStreamReader(clientSocket.getInputStream());
        int c;
        StringBuffer requestBuffer = new StringBuffer();
        while ((c = clientInputStream.read()) != -1) 
        { 
            requestBuffer.append((char) c);
            if (requestBuffer.toString().endsWith(("\r\n\r\n")))
                break;
        }
        request = new Request(requestBuffer.toString(), clientSocket);
    } 
    catch (Exception e) // catch any possible exception in order to keep the thread running
    {
        try 
        {
            if (clientSocket != null)
                clientSocket.close();
        } catch (IOException ex) 
        {
            ex.printStackTrace();
        }
        System.err.println(e);
        //e.printStackTrace();
    }

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Ответ учебника должен установить soTimeout на вашем сокете, что вы можете сделать. Однако это работает не во всех случаях. Мой друг однажды продемонстрировал это, вытянув мой сетевой кабель. Я бы установил soTimeout со значением 30 секунд, но мое приложение просто зависло там навсегда.

Чтобы получить надежные тайм-ауты, лучше всего разделить ваш ввод / вывод на другой поток. Если поток не возвращается с ответом в течение заданного времени, вы можете попытаться прервать его, закрыть потоки и в конечном итоге уничтожить поток. Это не поможет вам, но постарается очистить потоки. По истечении времени ожидания вам нужно будет считать текущее соединение потерянным, восстановить соединение и повторно отправить предыдущую команду, чтобы повторить соединение. команда-шаблон может помочь здесь. Это гораздо проще сделать, если команды являются идемпотентными и могут выполняться несколько раз. Возможность повторения неудачных запросов может быть использована для устранения прерывистых ошибок ввода / вывода.

0 голосов
/ 20 мая 2010

Вы пытались установить таймауты на базовом сокете? См. Socket.setSoTimeout () . Из документа:

Если для этой опции задано ненулевое значение тайм-аут, вызов read () InputStream связан с этим Сокет будет блокировать только на эту сумму времени. Если время ожидания истекло, java.net.SocketTimeoutException поднял, хотя гнездо все еще действительный

...