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



我想创建不应该关闭的保持活动连接。我试过下面的方式,但在日期打印出来后就关闭了。

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 OKrnrn" + 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 OK

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

预期结果为:

curl-i-X GET-H"连接:保持活力"http://localhost:1122/

HTTP://1.1 200 OK

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

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

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

也是如此

如何创建保活连接?

您弄错了持久连接的目的。它允许您通过一个连接发出多个请求并获得多个响应。

在你的测试中,你发送了一个请求,并且你试图提供一个无限长度的响应体。

您试图提供无限长度响应体的方式是不正确的。请阅读本RFC,特别注意";传输编码";。一些精选报价:

HTTP/1.0中的持久连接是明确协商,因为它们不是默认行为。HTTP://1.0持久连接的实验实现是错误的,HTTP/1.1中的新设施就是为了纠正这些问题而设计的问题。

。。。

持久连接是HTTP/1.1消息;我们为引入了一个新关键字(Connection:close(声明非持久性。参见第14.10节。

。。。

7.2.2实体长度

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

。。。

4.4消息长度

消息的传输长度是消息正文的长度它出现在消息中;也就是说,在任何传输编码已应用。当消息正文包含在消息中时该实体的传递长度由以下其中一项决定(按优先顺序(:

。。。

2.如果存在传输编码头字段(第14.41节(,并且具有除";"身份";,则传输长度为通过使用";分块的";传输编码(第3.6节(,除非通过关闭连接来终止消息。

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

4.如果消息使用媒体类型";多部分/字节范围";,以及transfer长度未另行指定,则此self-清除介质类型定义传输长度。此媒体类型除非发件人知道收件人可能会纵火,否则不得使用UST它请求中存在具有多字节的Range标头-1.1客户端的范围说明符意味着客户端可以解析多部分/字节范围响应。

范围标头可能由1.0代理转发了解多部分/字节范围;在这种情况下,服务器必须使用第1、3或5项中定义的方法对消息进行定界本节。

5.通过服务器关闭连接。(关闭连接不能用于指示请求正文的结束,因为则服务器不可能发回响应。(

相关内容

  • 没有找到相关文章

最新更新