如何通过http持久连接

时间:2016-08-21 05:03:59

标签: java php http persistent-connection

我是http连接的新手。我想要意识到的是服务器应该通过持久连接定期向客户端发送一些数据(通知)。

我在服务器端编写了一个代码,如:

<?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/>

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

2 个答案:

答案 0 :(得分:0)

刷新连接似乎是个好主意。但我认为我找到了更好的解决方案。我认为最好使用5(N分钟)分钟超时来建立持久连接,而不是保持与无限制超时的连接。这样做更好,因为当用户意外脱机时,服务器仍会保持连接处于活动状态。这不好。这就是为什么我要为通知制作5(此号码是可选的)连接的原因。也就是说,服务器将使用第一个通知并在发送请求后关闭连接,其余4个连接将处于执行状态。当客户端(或Java客户端)将收到通知时,它将建立新连接以填充缺少的部分或连接超时。 并且每次都会立即通知客户(当然如果连接到互联网)。 如果有人有更好的解决方案,我会很高兴看到这一点。

答案 1 :(得分:0)

  1. 在HTTP / 1.1服务器的响应中添加Connection: keep-alive标头实际上没有必要,为了向后兼容,它是无需的。
  2. 无论你在那个循环中睡多久或多少次,它都被客户视为一个请求。
  3. 话虽如此,您的客户端片段实际上只向http://localhost/connection.php发出一个请求,并且无法重新使用URLConnection来发送另一个请求(实现{{ 1}})。
  4. 总结:

    persistent行为在传输层(TCP)处理,更具体地说,您需要将Persistent Connection重复用于同一主机的多个请求以及a partially related question.中指定的其他一些要求。

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