采用java的servlet实现EventSource的服务端,客户端在每次接收请求后会断开,这是为什么?

问题描述

采用java的servlet实现EventSource的服务端,客户端在每次接收请求后会断开

问题出现的环境背景及自己尝试过哪些方法

jdk版本是1.7
servlet版本是servlet-api:2.5
使用nodejs作为后端时,不会出现每次断开的情况,一次连接后,可多次接收服务端的数据;

相关代码

服务端代码:

public class TestEventSource extends HttpServlet{

    private static final long serialVersionUID = 1L;
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
        response.setContentType("text/event-stream");
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Connection","keep-alive");
        response.setHeader("Access-Control-Allow-Origin","*");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        out.print("data: testEventSource\n");
        out.flush();
    }
}

客户端代码:

const evtSource = new EventSource('/y/adm/market/message');
evtSource.onopen = function onopen() {
  console.log('你创建了一个服务器长连接');
};
evtSource.onmessage = function onmessage(e) {
  console.log(e.data);
};
evtSource.onerror = function onerror(e) {
  console.log('你进入了onerror方法');
};

你期待的结果是什么?实际看到的错误信息又是什么?

客户端发起请求后,能够收到服务端的数据,但会立刻断开,触发onerror方法;之后每3秒循环一次
clipboard.png

按照我的理解,EventSource应该是一次请求后,保持连接,不断接收服务端返回的数据,不应该断开连接。实际上使用nodejs作为服务端确实是这样的,能够一次请求,多次接收服务端的数据;

问题出在哪里?请大佬指点

阅读 2.8k
2 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题