我是 HTTP 连接的新手。我想意识到的是,服务器应该通过持久连接定期向客户端发送一些数据(通知)。
我在服务器端用 php 写了一段代码:
<?php
set_time_limit(0);
header('Connection: keep-alive');
$i = 0;
while($i < 10){
echo "Hello$i<br/>";
sleep(5);
$i++;
}
?>
并尝试通过java连接到服务器:
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://localhost/connection.php");
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
我希望每五秒从服务器获取一次内容,如下所示:
Hello0<br/>
Hello1<br/>
...
但是 java 客户端等待 50 秒而不是这个。和打印:
Hello0<br/>Hello1<br/>Hello2<br/>Hello3<br/>Hello4<br/>Hello5<br/>Hello6<br/>Hello7<br/>Hello8<br/>Hello9<br/>
我希望服务器自己发送通知。而不是客户端每五秒连接一次服务器。
最佳答案
- 真的没有必要添加
Connection: keep-alive
header 来响应 HTTP/1.1 服务器,除非是为了向后兼容。 - 无论您在该循环中 hibernate 多长时间或多少次,它仍然被客户端视为一个请求。
- 话虽这么说,实际上,您的客户端代码段只向
http://localhost/connection.php
发出一个请求,并且不可能重用URLConnection
为了分派(dispatch)另一个请求(实现持久性
)。
总结:
Persistent Connection
行为在传输层 (TCP) 处理,更具体地说,您需要重用 client socket
对同一主机的多个请求加上其他一些HTTP/1.1 中规定的要求.
去找一些适合自己需求的项目,不要重新发明轮子。
关于java - 如何通过http长连接从服务端定时向客户端发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39060975/