有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

只要我修改服务器,java SSE客户端就会停止工作(服务器发送事件)

我有一个非常简单的SSE(Html5的服务器发送事件),服务器端使用Java。我已经包括了下面的客户端和服务器。问题是,如果我更改服务器端,即使是简单的更改,例如更改调试输出中的文本(这与发送到服务器的实际文本无关),客户端也会停止发布接收到的消息。根据服务器端打印的输出消息,以及我在Firebug和Chrome的开发工具中看到的请求流量,我可以看到服务器正在发送消息,而浏览器接收消息。唯一的问题是,接收SSE时应该触发的JavaScript函数没有被触发。有什么建议吗,或者你认为我的代码有什么问题吗

<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
<div id="result"></div>

<script>
    if(typeof(EventSource)!=="undefined")
    {
      var source=new EventSource("/ServerSideForSSE/sse3");
      source.onmessage=function(event)
      {
            document.getElementById("result").innerHTML+=event.data + "<br>";
      };
    }
    else
    {
      document.getElementById("result").innerHTML= 
"Sorry, your browser does not support server-sent events...";
    }
</script>

</body>
</html>

package com.ultratech;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/sse3")
public class sse3 extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doGet(HttpServletRequest request, 
                HttpServletResponse response) 
            throws ServletException, IOException 
    {

        response.setCharacterEncoding("utf-8");
        response.setContentType("text/event-stream");  


          PrintWriter out = response.getWriter(); 
          int x = 0;
          while (x < 100) 
          {
              x++;
              Date currentTime_1 = new Date();        
              out.println("Current Time is: " + currentTime_1);     
              out.println();  
              out.flush();
              System.out.println("Another message sent to the cleint ...");
              if (x > 100) {System.exit(0);}
              try {
                Thread.sleep(5 * 1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }//End of for().        
          out.close();                  
    }//End of doGet().

}

共 (1) 个答案

  1. # 1 楼答案

    您发送的每封邮件必须以字符串“data:”(不包括引号)开头,后面必须有一个空行

    如果你不遵循这个语法,那么客户端不会考虑你发送什么作为消息,因此函数不会被触发。