Подтвердить что ты не робот

Сервер отправил события + 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. Есть идеи? Кто-нибудь видит что-то не так с исходным кодом?

Спасибо заранее. Агустин

4b9b3361

Ответ 1

Для тех, кто с этой проблемой, проблема была связана с новыми строками, необходимыми после данных. В принципе, вам нужны две строки, а не одна, как я использовал. Таким образом, он работает повсюду.

Измените это:

return "data:Testing 1,2,3" + r.nextInt() +"\n";

Для этого:

return "data:Testing 1,2,3" + r.nextInt() +"\n\n";

Устраняет проблему.

Ответ 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();
?>

Любые идеи?