Я новичок в 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/>
Я хочу, чтобы сервер отправлял уведомления сам. вместо клиента подключайтесь к серверу каждые пять секунд.
Connection: keep-alive
заголовок в ответе для HTTP / 1.1 сервера, UNLESS для обратной совместимости.http://localhost/connection.php
и невозможно повторно использовать URLConnection
для отправки другого запроса (достижения persistent
).подводить итоги:
Persistent Connection
поведение обрабатывается на транспортном уровне (TCP), более конкретно, вы должны повторно использовать client socket
для нескольких запросов к одному и тому же хосту плюс некоторые другие требования, указанные в HTTP / 1.1.
Иди и найди несколько проектов, которые подходят для твоих потребностей, не изобретай велосипед.
Очистка соединений казалась действительно хорошей идеей. Но я думаю, что нашел лучшее решение. Вместо того, чтобы поддерживать соединение с неограниченным таймаутом, я думаю, что лучше сделать постоянное соединение с 5 (N минутами) таймаутом. Это лучше, потому что когда пользователь неожиданно отключится от сети, сервер все равно будет поддерживать соединение живым. и это не хорошо. Вот почему я собираюсь сделать 5 (это число необязательно) подключений для уведомления. То есть сервер будет использовать первый для уведомления и закрывает соединение после отправки запроса, а остальные 4 соединения будут дежурными. Когда клиент (или клиент java) получит уведомление, он установит новое соединение, чтобы заполнить недостающую часть, или время соединения истекло.
и клиент будет уведомлен немедленно каждый раз (конечно, если он подключен к Интернету).
Если у кого-то есть лучшее решение, я буду рад это увидеть.