如何在Java中创建持久的Http连接

时间:2018-08-02 13:24:13

标签: java keep-alive soaphttpclientprotocol

我要创建保持活动连接,该连接不应关闭。我尝试了以下方式,但在打印日期后将关闭。

public class SimplePHTTPServer {
  public static void main(String args[]) throws IOException {
    ServerSocket server = new ServerSocket(1122);
    System.out.println("Listening for connection on port 1122 ....");
    while (true) {
      try (Socket socket = server.accept()) {
        Date today = new Date();
        String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
        socket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
        Thread.sleep(5000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
    }
  }
}

通过下面的卷曲测试是实际输出:

  

curl -i -X GET -H“连接:保持活动状态” http://localhost:1122/

     

HTTP / 1.1 200确定

     

IST 2018年8月2日星期四18:42:30

预期结果是:

  

curl -i -X GET -H“连接:保持活动状态” http://localhost:1122/

     

HTTP / 1.1 200确定

     

IST 2018年8月2日星期四18:42:30

     

IST 2018年8月2日星期四18:47:30

     

IST 2018年8月2日星期四18:52:30

     

...等等

如何创建保持活动连接?

1 个答案:

答案 0 :(得分:0)

您误认为了持久连接的目的。它使您可以通过一个连接发出多个请求并获得多个响应。

在测试中,您发送了一个请求,并试图提供一个长度不受限制的响应正文。

您尝试提供无限长度的响应正文的方法不正确。请阅读此RFC,尤其要注意“传输编码”。一些选择引号:

  

HTTP / 1.0中的持久连接为      明确协商,因为它们不是默认行为。 HTTP / 1.0      持久性连接的实验性实施存在错误,      HTTP / 1.1中的新功能旨在纠正这些问题      问题。

...

  

持久连接是默认的      HTTP / 1.1消息;我们引入了一个新的关键字(连接:close)      声明非持久性。请参阅第14.10节。

...

  

7.2.2实体长度

     

消息的实体长度是消息主体的长度      在应用任何传输编码之前。 4.4节定义      如何确定邮件正文的传输长度。

...

  

4.4邮件长度

     

消息的传输长度是消息主体的长度,如      它出现在消息中;也就是说,在任何传输编码之后      已应用。当消息中包含消息正文时,      该物体的传输长度由以下之一确定      (按优先顺序):

...

  

2。如果存在Transfer-Encoding头字段(第14.41节),并且        除“ identity”外具有任何值,则传输长度为        通过使用“块式”传输编码(第3.6节)进行定义,        除非通过关闭连接终止消息。

     

3。如果存在Content-Length标头字段(第14.13节),则其        OCTET中的十进制值表示实体长度和        传输长度。内容长度标头字段不得发送        如果这两个长度不同(即,如果传输编码        标头字段存在)。如果同时收到一条消息        传输编码标头字段和内容长度标头字段,        后者必须忽略。

     

4。如果消息使用媒体类型“ multipart / byteranges”,并且        除非另外指定ransfer-length,否则此自我        限制媒体类型定义了传输长度。此媒体类型        除非发件人知道收件人可以屁股,否则请勿使用        它;在请求中存在具有多个字节的Range标头-        来自1.1客户端的范围说明符意味着留置权人可以解析        多部分/字节范围响应。

     

范围标头可能由不包含以下内容的1.0代理转发        了解多部分/字节范围;在这种情况下,服务器必须        使用第1、3或5项中定义的方法来分隔消息        此部分。

     

5。通过服务器关闭连接。 (关闭连接        不能用来表示请求主体的结尾,因为        服务器将无法发送回响应。)