停止服务器发送事件中的重复输出

时间:2013-10-05 04:03:46

标签: java tomcat servlets server-sent-events

在COMET,SOCKETS,SSE中,我觉得服务器发送事件很容易实现 我正在使用tomcat服务器,因此我使用servlet来实现SSE。

但是我在这里遇到了很大的问题并且搜索了很多,但我没有得到任何解决方案。

问题是如果您在 sever sent event

看到基本示例

输出每4秒重复一次,我们不能让它改变同一行的输出 详细说明:
4秒后,新的更新结果将在先前输出的下一行中打印,
我想让它打印在前一个输出的同一行(在前面的输出上写一遍)
它应该看起来像一个数字手表。

我的servlet代码就像我必须要做的那样。

  import java.io.IOException;
  import java.io.PrintWriter;
  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("/SseServer")
  public class SseServer extends HttpServlet {
  private static final long serialVersionUID = 1L;
  protected void doGet(HttpServletRequest request,
  HttpServletResponse response) throws ServletException, IOException {
  doPost(request, response);
  }

  protected void doPost(HttpServletRequest request,
  HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/event-stream;charset=UTF-8");
  response.setHeader("Cache-Control", "no-cache");
  response.setHeader("Connection", "keep-alive");

  PrintWriter out = response.getWriter();

  while (true) {
     out.print("id: " + "ServerTime" + "\n");
     out.print("data: " + new Date().toLocaleString() + "\n\n");
     out.flush();
     try {
            Thread.currentThread().sleep(4000);
       } catch (InterruptedException e) {
          e.printStackTrace();
          }
    }
 }

}

我认为使用while循环将其作为重复结果。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您链接的示例使用以下代码:

document.getElementById("result").innerHTML += event.data + "<br>";

因此,它将新事件数据附加到result元素的内容中。要替换它,只需将其更改为

document.getElementById("result").innerHTML = event.data + "<br>";

简而言之,您的问题与您在服务器端如何生成事件没有任何关系,而是与您在浏览器中使用事件的方式有关。