【问题标题】:Server sent events + Java with Spring MVC服务器发送事件 + Java 与 Spring MVC
【发布时间】:2012-04-22 04:50:30
【问题描述】:

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

提前致谢。 奥古斯丁

【问题讨论】:

  • 你确定你在XP上安装的Chrome版本和其他代码成功的版本是一样的吗?
  • 如果删除 response.setContentType("text/event-stream"); 会发生什么?也许 XP 无法识别此内容类型?
  • 如果我删除它,我得到 EventSource 的响应具有不是“text/event-stream”的 MIME 类型(“text/html”)。中止连接。

标签: java javascript html spring-mvc


【解决方案1】:

对于遇到此问题的任何人,问题与数据后所需的新行有关。基本上,你需要两行而不是我使用的一行。这样它就可以在任何地方工作。

改变这个:

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

到这里:

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

解决问题..

【讨论】:

    【解决方案2】:

    请注意 Spring Framework 4.2+ 支持 natively SSE,而不是手动实现 SSE。请参阅 this sample SSE enabled controller 返回 SseEmitter

    【讨论】:

      【解决方案3】:

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

      你可以看看here。你会看到我有两个不同的按钮;第一个用于创建事件源,第二个用于断开连接。

      代码直接打印到 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();
      ?>
      

      有什么想法吗?

      【讨论】:

        猜你喜欢
        • 2014-07-17
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多