【发布时间】:2016-03-08 18:06:43
【问题描述】:
我正在使用套接字发送 HTTP GET 请求,以便通过 SCPI 命令控制信号发生器。 我设法发送了几个请求并从服务器接收答案。
我的问题是,如果我等待大约 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 请求,如下所示:
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() 始终为 false
编辑:
我没有实现自己的 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 库之类的东西吗?我不知道(我按照我要控制的设备的手动说明)
-
我现在使用 java.net.URL;它处理我的请求并避免我的问题。感谢您的帮助!
标签: java sockets http bufferedreader printwriter