0

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

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

问题是如果您在服务器发送事件中看到基本示例

输出每 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 循环使其成为重复的结果。

非常感谢您的帮助

4

1 回答 1

2

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

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

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

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

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

于 2013-10-05T05:48:31.980 回答