Стандарт SSE требует, чтобы браузер автоматически переподключался через N секунд, если соединение потеряно или если сервер намеренно закрывает сокет. (N по умолчанию 5 в Firefox, 3 в Chrome и Safari, последний раз я проверял.) Итак, если это желательно, вам не нужно ничего делать. (В WebSockets вам придется реализовать такое переподключение для себя.)
Если такое повторное подключение нежелательно, вам следует вместо этого отправить сообщение клиенту, в котором говорится: «шоу окончено, уходите». Например. если вы транслируете финансовые данные в потоковом режиме, вы можете отправить их в пятницу вечером, когда рынки будут закрыты. Затем клиент должен перехватить это сообщение и закрыть соединение со своей стороны. (После этого сокет исчезнет, поэтому серверный процесс автоматически закроется.)
В JavaScript и при условии, что вы используете JSON для отправки данных, это будет выглядеть примерно так:
var es = EventSource("/datasource");
es.addEventListener("message", function(e){
var d = JSON.parse(e.data);
if(d.shutdownRequest){
es.close();
es=null;
//Tell user what just happened.
}
else{
//Normal processing here
}
},false);
ОБНОВЛЕНИЕ:
Вы можете узнать, когда происходит повторное подключение, послушав событие "close", а затем посмотрев на e.target.readyState
es.addEventListener("error", handleError, false);
function handleError(e){
if(e.target.readyState == 0)console.log("Reconnecting...");
if(e.target.readyState == 2)console.log("Giving up.");
}
Никакая другая информация недоступна, но, что более важно, она не может отличить ваш серверный процесс от преднамеренного закрытия соединения, сбоя вашего веб-сервера или обрыва интернет-соединения вашего клиента.
Еще одна вещь, которую вы можете настроить, - это время повтора, если сервер отправит retry:NN
сообщение. Поэтому, если вы не хотите быстрого переподключения, но вместо этого хотите, чтобы между любыми попытками переподключения было не менее 60 секунд, пусть ваш сервер отправит retry:60
.
person
Darren Cook
schedule
07.07.2015
EventSource
? - person dm03514   schedule 07.07.2015