qq_18395863 2019-04-09 16:15 采纳率: 0%
浏览 1311

eventSource 每次都会触发open 、error事件

前台代码:
if (window.EventSource) {
console.log("Event source available");
var source = new EventSource("${ctx}"+"/sseMsg");

    source.addEventListener('message', function(e) {
        console.log(e.data);
        $.pCommon.message(e.data);

        //source.close(); // close connection, otherwisse browser will request the server constantly
    });
    source.addEventListener('open', function(e) {
        console.log("Connection was opened.");
    }, false);

    source.addEventListener('error', function(e) {
        console.log(e);
        /* if (e.readyState == EventSource.CLOSED) {
            console.log("Connection was closed.");
        } else {
            console.log(e.readyState);
        } */

    }, false);

 } else {
        console.log("服务器不支持EvenSource对象");
}

后台代码:
public class SseServlet extends HttpServlet

{
/**
* serialVersionUID:TODO(用一句话描述这个变量表示什么).
*
* @since JDK 1.6
*/
private static final long serialVersionUID = 1L;

public void doPost(HttpServletRequest request, HttpServletResponse response)
{
    try
    {
        //最后一次接收到的事件的标识符
        String last = request.getHeader("Last-Event-ID");
        String retry = "retry:"+10000+"\n";//浏览器默认的是,如果服务器端三秒内没有发送任何信息,则开始重连。服务器端可以用retry头信息,指定通信的最大间隔时间。
        response.setContentType("text/event-stream"); // SSE header
        response.setCharacterEncoding("utf-8");
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Connection","keep-alive");

        // 从消息队列中获取app、web消息推送对应操作人
        //在全局范围内使用LinkedBlockingQueue对象,当有需要发送的数据时,将数据放到队列中,然后在循环中调用poll方法即可
        // do something
        PrintWriter writer = response.getWriter();
        //多行数据的话每一行前面都要data:之后加上一个\n,最后一行是两个\n。           
        //以冒号开头的行,表示注释。通常,服务器每隔一段时间就会向浏览器发送一个注释,保持连接不中断。
        writer.write(retry);
        for(int i=0; i<10; i++) {

            writer.write("data: "+ System.currentTimeMillis() +"\n\n");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        writer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
{
    doPost(request, response);
}

}

运行结果:每次触发open、error事件,导致每次断开重连,请问是哪里写的有问题,导致触发onerror事件
图片说明

  • 写回答

2条回答 默认 最新

  • 小熊海啸 2021-10-26 15:53
    关注

    求答案

    评论

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号