【问题标题】:Has BufferedReader a Timeout when sending HTTP Get Request?发送 HTTP Get 请求时 BufferedReader 是否超时?
【发布时间】: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


【解决方案1】:

看来我的问题来自 BufferedReader 的“超时”

没有。没有这样的东西。

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

这仅仅意味着还没有数据到达。你的期望在这里有问题。而不是毫无意义的sleep() 和同样毫无意义的ready() 测试,您应该阻塞read(),直到数据到达或EOS 或发生异常。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2020-03-14
    • 2014-07-06
    • 2020-09-10
    相关资源
    最近更新 更多