2016-08-21 70 views
2

我是http连接的新成员。我想要实现的是服务器应该通过持久连接周期性地向客户端发送一些数据(通知)。如何通过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/> 

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

+0

你永远不会冲洗你的连接服务器端。 – chrylis

+0

@chrylis以及如何做到这一点?如果服务器刷新它不会失去连接?使用'sleep(5)'前加上 – Vanguard

+0

,添加'flush();'和'ob_flush();' –

回答

0

冲洗连接似乎是个好主意。但我认为我找到了更好的解决方案。而不是保持与无限的超时连接,我认为最好使5(N分钟)分钟超时连接。更好的原因是,当用户意外脱机时,服务器将始终保持连接。并不好。这就是为什么我要使5(这个数字是可选的)连接进行通知。这是服务器将使用第一个通知,并在发送请求后关闭连接,其余4个连接将执行。当客户端(或Java客户端)将收到通知时,它将创建新的连接以填充缺失部分或连接超时。 ,并且客户端每次都会立即通知(当然如果连接到互联网)。 如果有人有更好的解决方案,我会很高兴看到这一点。

0
  1. 确实没有必要为HTTP/1.1服务器添加Connection: keep-alive标头,除非是向后兼容。
  2. 无论您在此循环中睡多久或多次,它都被客户端视为一次请求。
  3. 说的是,你的客户端代码片段,实际上只发出一个请求到http://localhost/connection.php,并且为了发送另一个请求(实现persistent),不可能重用URLConnection

总结:

Persistent Connection行为是在传输层(TCP),更具体地,则需要重新使用client socket多个请求到HTTP/1.1中指定的相同的主机加上一些其它要求处理的。

去找一些适合您需求的项目,不要重蹈覆辙。

+0

是的,你是对的连接:保持活着没有必要。 – Vanguard

+0

顺便说一句,服务器发送未经请求的响应是不切实际的。改用'''websocket'''来代替。 –

相关问题