12

我目前遇到与 SSE 和 Windows XP 相关的问题。下面的源代码目前在我尝试过的所有 Chrome 中都可以使用,除了 Windows XP 中的 Chrome(?)不知道为什么。这旨在用于用户必须使用 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); 在 Windows XP 中使用 Chrome 时打印“错误”。有任何想法吗?有人看到源代码有什么问题吗?

提前致谢。奥古斯丁

4

3 回答 3

11

For anyone with this problem, the problem was related to the new lines needed after the data. Basically, you need two lines and not one as I was using. That way it works everywhere.

Changing this:

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

To this:

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

Fixes the problem..

于 2012-04-10T17:00:45.510 回答
5

请注意 Spring Framework 4.2+ 原生支持 SSE,而不是手动实现SSE。请参阅此示例启用 SSE 的控制器返回SseEmitter

于 2015-10-13T08:37:16.630 回答
0

好的,我在 PHP + HTML5 中创建了一个小例子。

你可以看看这里。你会看到我有两个不同的按钮;第一个创建事件源,第二个断开它。

代码直接打印到 Firefox/chrome 控制台。正如您将看到的,消息处理程序在 firefox 中调用,而不是在 chrome 中调用。

到目前为止,这不适用于我测试过的任何 chrome。

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();
?>

有任何想法吗?

于 2012-04-10T15:36:43.630 回答