2016-08-21 2 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 и как это сделать? Если сервер сбросится, он не потеряет соединение? – Vanguard

+0

перед строкой с 'sleep (5)', добавьте 'flush();' и 'ob_flush();' –

ответ

0

Промывка соединений показалась действительно хорошей идеей. Но я думаю, что нашел лучшее решение. Вместо того, чтобы поддерживать связь с неограниченным таймаутом, я думаю, что лучше сделать постоянное соединение с таймаутом в 5 (N минут) минут. Это лучше, потому что, когда пользователь будет неожиданно отключен, сервер будет поддерживать соединение в любом случае. и это не хорошо. Вот почему я собираюсь сделать 5 (это число необязательным) для уведомления. То есть сервер будет использовать первый для уведомления и закрывает соединение после отправки запроса, а остальные 4 соединения будут дежурить. Когда клиент (или клиент java) получит уведомление, он будет устанавливать новое соединение для заполнения отсутствующей части или времени подключения. , и клиент будет уведомлен каждый раз каждый раз (конечно, если подключен к Интернету). Если у кого-то есть лучшее решение, я буду рад это видеть.

0
  1. На самом деле нет необходимости добавлять заголовок Connection: keep-alive в ответ на сервер HTTP/1.1, ЕСЛИ НЕОБХОДИМО для обратной совместимости.
  2. Независимо от того, как долго или много раз вы спите в этом цикле, он все равно рассматривается как ОДИН запрос.
  3. с учетом того, что ваш клиентский фрагмент, по сути, делает только ОДИН запрос к http://localhost/connection.php, и невозможно повторно использовать URLConnection, чтобы отправить другой запрос (достижение persistent).

подытожить:

Persistent Connection поведения осуществляются на транспортном уровне (TCP), более конкретно, вы должны повторно использовать client socket для множественного запроса на тот же хост, а также некоторые другие требования, указанный в HTTP/1.1 ,

Идите и найдите проекты, которые подходят для ваших нужд, не изобретайте велосипед.

+0

Да, вы правы. Связь: сохранить жизнь не нужно. – Vanguard

+0

BTW непрактично для сервера отправлять незапрашиваемый ответ. вместо этого используйте '' 'websocket'''. –

 Смежные вопросы

  • Нет связанных вопросов^_^