Я использую сокет для отправки запроса 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;
}
}
Почему вы используете HTTP самостоятельно? Там будут проблемы. Например, используя «.ready()», чтобы проверить, нет ли данных больше (и может привести к тем проблемам, которые вы объясните). Также: ничто не гарантирует, что соединение TCP/IP все равно будет открыто. Фактически, поскольку вы укажете HTTP/1.0, соответствующий сервер закроет соединение после отправки ответа (если я правильно помню свои HTTP RFC, ключевое слово: keep-alive). –
Вы предлагаете мне использовать что-то вроде библиотек HTTP? Я не знаю об этом (я следую инструкциям руководства по оборудованию, которое хочу контролировать) – user2310493
Я использую сейчас java.net.URL; который обрабатывает мою просьбу и избегает моей проблемы. Спасибо за помощь! – user2310493