2016-08-21 38 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'''來代替。 –

相關問題