我正在使用套接字发送HTTP GET请求,以便通过SCPI命令控制信号发生器。 我设法发送多个请求并从服务器接收答案。
我的问题是,如果我等待大约15秒,然后我再次发送请求,我没有得到任何答复我的请求。似乎BufferedReader不再收到任何消息
我已将套接字的超时设置为无限。看来我的问题来自BufferedReader的“超时”,因为他的ready
方法总是返回false。
再次接收消息的唯一解决方案是关闭并重新创建我的Socket,PrintWriter和BufferedReader。
我声明我的socket和PrintWriter以及BufferedReader,如下所示:
tcpIpSocket = new Socket(ipAddress, tcpPort);
printWriteOutputStream = new PrintWriter(tcpIpSocket.getOutputStream(),false);
bufferInputStream = new BufferedReader(new InputStreamReader(tcpIpSocket.getInputStream()));
我使用单独的函数发送和接收我的HTTP GET请求,如下所示:
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()
始终为假
编辑:
我没有实现自己的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;
}
}
答案 0 :(得分:0)
似乎我的问题来自"超时" BufferedReader的内容
没有。没有这样的事情。
因为他的ready方法总是返回false。
这仅仅意味着还没有数据到达。你的期望是错误的。除了无意义的sleep()
和同样毫无意义的ready()
测试之外,您应该阻止read()
直到数据到达或EOS或异常发生。
如果您不想永久阻止,请在套接字上设置读取超时。不要关闭你实际需要的机制,然后尝试通过其他方式重现它。