Сервер отправил события + Java с помощью Spring MVC
В настоящее время у меня проблема с SSE и Windows XP. Исходный код ниже работает в каждом Chrome, который я пробовал, за исключением Chrome в Windows XP (?) Не знаю, почему. Это предназначено для использования на панели управления, где пользователи должны использовать Chrome. Другими словами, меня не интересуют IE, Firefox и т.д.
Проблема: события на стороне сервера работают повсюду (Chrome), но не в Windows XP (Chrome). Когда я говорю, что это работает, я имею в виду, что вызывается обработчик сообщений.
Код
-
Код Javascript
if (!!window.EventSource) {
console.log("Event source available");
var source = new EventSource('/admin/systemalert');
source.addEventListener('message', function(e) {
console.log(e.data);
});
source.addEventListener('open', function(e) {
console.log("Connection was opened.");
}, false);
source.addEventListener('error', function(e) {
if (e.readyState == EventSource.CLOSED) {
console.log("Connection was closed.");
} else {
console.log(e.readyState); <-- in windows XP it prints Error here
}
}, false);
} else {
console.log("No SSE available");
}
-
Кодовый код сервера
@Controller
@RequestMapping("/admin/**")
public class AdminController {
@RequestMapping("systemalert")
public @ResponseBody String sendMessage(HttpServletResponse response) {
Random r = new Random();
response.setContentType("text/event-stream");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "data:Testing 1,2,3" + r.nextInt() +"\n";
}
}
Как указано в коде, строка console.log(e.readyState); печатает "Ошибка" при использовании Chrome в Windows XP. Есть идеи? Кто-нибудь видит что-то не так с исходным кодом?
Спасибо заранее.
Агустин
Ответы
Ответ 1
Для тех, кто с этой проблемой, проблема была связана с новыми строками, необходимыми после данных. В принципе, вам нужны две строки, а не одна, как я использовал. Таким образом, он работает повсюду.
Измените это:
return "data:Testing 1,2,3" + r.nextInt() +"\n";
Для этого:
return "data:Testing 1,2,3" + r.nextInt() +"\n\n";
Устраняет проблему.
Ответ 2
Вместо того, чтобы внедрять вручную SSE, имейте в виду, что Spring Framework 4.2+ поддерживает изначально SSE. См. этот образец контроллера с поддержкой SSE, возвращая SseEmitter.
Ответ 3
Хорошо, я создал небольшой пример в PHP + HTML5.
Вы можете посмотреть здесь здесь. Вы увидите, что у меня две разные кнопки; один для создания источника события, а второй - для его отключения.
Код печатает непосредственно на консоли firefox/chrome. Как вы увидите, обработчик сообщения вызывается в firefox, но не в хроме.
Это не работает ни на одном из хром, который я тестировал до сих пор.
Пример вывода Firefox:
Creating event source
Open
Id: 1334072077
Message: Se puede leer esto?
Origin: http://arancione-consulting.com
Closed
Open
Id: 1334072082
Message: Se puede leer esto?
Origin: http://arancione-consulting.com
Closed
Пример вывода Chrome:
Creating event source
Open
Closed
Open
Closed
В случае, если кто-то хочет знать, код на стороне сервера:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // prevent caching of event data.
echo "id: " . time() . "\n";
echo "Event: time\n";
echo "data: Se puede leer esto?\n";
flush();
?>
Любые идеи?