java - 如何通过http长连接从服务端定时向客户端发送请求

标签 java php http persistent-connection

我是 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/>

我希望服务器自己发送通知。而不是客户端每五秒连接一次服务器。

最佳答案

  1. 真的没有必要添加 Connection: keep-alive header 来响应 HTTP/1.1 服务器,除非是为了向后兼容。
  2. 无论您在该循环中 hibernate 多长时间或多少次,它仍然被客户端视为一个请求。
  3. 话虽这么说,实际上,您的客户端代码段只向 http://localhost/connection.php 发出一个请求,并且不可能重用 URLConnection为了分派(dispatch)另一个请求(实现持久性)。

总结:

Persistent Connection 行为在传输层 (TCP) 处理,更具体地说,您需要重用 client socket 对同一主机的多个请求加上其他一些HTTP/1.1 中规定的要求.

去找一些适合自己需求的项目,不要重新发明轮子。

关于java - 如何通过http长连接从服务端定时向客户端发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39060975/

相关文章:

java - 贝塞尔曲线图 x,y 指向屏幕

java - 使用 JSON 和 Hibernate JPA 进行无限递归

php - CSS 自定义字体在 Web 主机中显示不正确,但在本地主机中显示不正确

php - Bootstrap 使用模态删除记录

javascript - 如果类似的工作已经完成,则推迟 Node.js HTTP 请求

java - 如何在java中以HHhMM格式显示时间?

java - Camel : java. lang.IllegalArgumentException:必须指定 defaultEndpoint

PHP:下载的二进制文件末尾有一个附加字节(0x0a)

http - 如何查询elasticsearch获取两个时间戳之间的数据

apache - 如何使用http请求查询apache http文件服务器中的文件列表