我要创建保持活动连接,该连接不应关闭。我尝试了以下方式,但在打印日期后将关闭。
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
...等等
如何创建保持活动连接?
答案 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。通过服务器关闭连接。 (关闭连接 不能用来表示请求主体的结尾,因为 服务器将无法发送回响应。)