问题 服务器使用Spring MVC发送事件+ Java


我目前遇到与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时打印“错误”。有任何想法吗?有人看到源代码有什么问题吗?

提前致谢。 奥古斯丁


6930
2018-04-09 20:40


起源

您确定在XP上安装的Chrome版本与代码成功的其他版本相同吗? - John Farrelly
如果你删除了会发生什么 response.setContentType("text/event-stream");?也许这种内容类型在XP上无法识别? - nickdos
如果我删除了我得到的事件,那么EventSource的响应的MIME类型(“text / html”)不是“text / event-stream”。中止连接。 - Agustin Lopez


答案:


对于有此问题的任何人,问题与数据之后所需的新行有关。基本上,你需要两条线,而不是我使用的一条线。这样它无处不在。

改变这个:

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

对此:

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

修复问题..


11
2018-04-10 17:00



这适合我!谢谢 - calbertts


而不是手动SSE,请注意Spring Framework 4.2+支持 本地SSE。看到 此示例SSE启用控制器 回来了 SseEmitter


4
2017-10-13 08:37





好的,我在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();
?>

有任何想法吗?


0
2018-04-10 15:36