Как периодически отправлять запрос клиенту с сервера по постоянному соединению 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/>

Я хочу, чтобы сервер отправлял уведомления сам. вместо клиента подключайтесь к серверу каждые пять секунд.

2

Решение

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

подводить итоги:

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

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

0

Другие решения

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

0

По вопросам рекламы [email protected]