2016-03-08 2 views
-1

Я использую сокет для отправки запроса HTTP GET для управления генератором сигналов через команды SCPI. Мне удалось отправить несколько запросов и получить ответ с сервера.Имеет ли BufferedReader время ожидания при отправке запроса HTTP Get?

Моя проблема в том, что я жду около 15 секунд, а затем снова отправляю запросы, я не получаю ответа на мои запросы. Кажется, что BufferedReader больше не получил никакого сообщения

Я установил тайм-аут моего сокета бесконечным. Кажется, моя проблема исходит из «тайм-аута» BufferedReader, поскольку его метод ready возвращает всегда false.

Единственным решением для получения сообщения является закрытие и повторное создание моих Socket, PrintWriter и BufferedReader.

Я объявляю свой сокет и PrintWriter и BufferedReader, как показано ниже:

tcpIpSocket = new Socket(ipAddress, tcpPort); 
printWriteOutputStream = new PrintWriter(tcpIpSocket.getOutputStream(),false); 
bufferInputStream = new BufferedReader(new InputStreamReader(tcpIpSocket.getInputStream())); 

Я использую отдельную функцию для отправки и получил мой запрос HTTP GET, как Folow:

public static String sendRequestToSigGenerator(String scpiMessageToSend) throws Exception { 

    StringBuffer receivedHTTPMessages=new StringBuffer(); 
    int receivedCharacterFromInputStreamInt; 

    printWriteOutputStream.println("GET /;:"+scpiMessageToSend+ " HTTP/1.0\r\n"); 
    printWriteOutputStream.flush(); 

    Thread.sleep(100); //Sleep needed for the buffer to be filled 

    while (bufferInputStream.ready()) { 
     receivedCharacterFromInputStreamInt = bufferInputStream.read(); 
     receivedHTTPMessages.append((char)receivedCharacterFromInputStreamInt); 
    } 

    return(receivedHTTPMessages.toString()); 
} 

После не посылая сообщение для 15 секунд и отправке нового запроса while (bufferInputStream.ready() остается всегда ложным

EDIT: Вместо того чтобы внедрять собственные HTTP, я использую библиотеку: java.net.URL; которые обрабатывают легко мои запросы и избежать моей проблемы:

public static String sendHTTPRequest(String scpiCommand) throws Exception { 
    try{ 
     StringBuilder returnString= new StringBuilder(); 
     URL url = new URL("http://"+ipAddress+"/;:"+scpiCommand); 
     BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); 

     String strTemp = ""; 
     while (null != (strTemp = br.readLine())) { 
      returnString.append(strTemp); 
     } 
     return(returnString.toString()); 
    } catch (UnknownHostException e) { 
     return ERROR; 
    } catch (IOException e) { 
     return ERROR; 
    } 
} 
+1

Почему вы используете HTTP самостоятельно? Там будут проблемы. Например, используя «.ready()», чтобы проверить, нет ли данных больше (и может привести к тем проблемам, которые вы объясните). Также: ничто не гарантирует, что соединение TCP/IP все равно будет открыто. Фактически, поскольку вы укажете HTTP/1.0, соответствующий сервер закроет соединение после отправки ответа (если я правильно помню свои HTTP RFC, ключевое слово: keep-alive). –

+0

Вы предлагаете мне использовать что-то вроде библиотек HTTP? Я не знаю об этом (я следую инструкциям руководства по оборудованию, которое хочу контролировать) – user2310493

+0

Я использую сейчас java.net.URL; который обрабатывает мою просьбу и избегает моей проблемы. Спасибо за помощь! – user2310493

ответ

0

Кажется, моя проблема исходит от «тайм-аут» в BufferedReader

No. Eсть нет такой вещи.

как его готовый метод возвращает всегда false.

Это просто означает, что данные еще не получены. Это ваши ожидания, которые виноваты здесь. Вместо бесцельного sleep() и столь же бессмысленного теста ready() вы должны просто заблокировать в read() до тех пор, пока не появятся данные или не произойдет EOS или исключение.

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

Смежные вопросы