发送HTTP Get Request时BufferedReader是否超时?

时间:2016-03-08 18:06:44

标签: java sockets http bufferedreader printwriter

我正在使用套接字发送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;
    }
}

1 个答案:

答案 0 :(得分:0)

  

似乎我的问题来自"超时" BufferedReader的内容

没有。没有这样的事情。

  

因为他的ready方法总是返回false。

这仅仅意味着还没有数据到达。你的期望是错误的。除了无意义的sleep()和同样毫无意义的ready()测试之外,您应该阻止read()直到数据到达或EOS或异常发生。

如果您不想永久阻止,请在套接字上设置读取超时。不要关闭你实际需要的机制,然后尝试通过其他方式重现它。