服务器发送事件如何将响应发送到特定客户端

How Server Sent Event send response to a specific client

本文关键字:客户端 响应 事件 服务器      更新时间:2023-09-26

在服务器发送事件中,它始终向所有客户端发送相同的响应。 但我想知道的是,如何使用 Java 仅向一个客户端发送响应。

这是我在SW内部定义的事件.js(SSE)

var eventSource = new EventSource("HelloServlet");
eventSource.addEventListener('up_vote',function(event){
    console.log("data from s" , event.data);
    var title = event.data;
    self.registration.showNotification(title, {
          'body': event.data,
          'icon': 'images/icon.png'
        })
});

我只想向特定用户显示此通知。 不是每天。HelloServlet 是我的 servlet,它包含这个,

response.setContentType("text/event-stream");   
        response.setCharacterEncoding("UTF-8");
        PrintWriter writer = response.getWriter();
        String upVote = "u";
        String downVote = "d";
        for(int i=0; i<10; i++) {
            writer.write("event:up_vote'n");
            writer.write("data: "+ upVote +"'n'n");
            writer.write("event:down_vote'n");
            writer.write("data: "+ downVote +"'n'n");
            writer.flush();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        writer.close();

您只向所有客户端发送相同消息的原因是,您只有一个通道,它们都连接到。EventSource只是您保持打开状态的GET请求。像任何 get 请求一样,您可以通过几种方式将其定制给特定用户。

var eventSource = new EventSource("HelloServlet?username=their-user-name");

在此示例中,您将使用查询字符串为每个人创建唯一的频道。然后,您需要服务器端的逻辑来根据username变量发送不同的内容。

您也可以使用会话。因此,您可以将当前代码保留在客户端上。

var eventSource = new EventSource("HelloServlet");

但是在服务器端,您需要检查会话,然后根据会话信息具有发送不同内容的逻辑。

这有帮助吗?

我知道

这篇文章很旧,但仍然值得一提的是这个问题的解决方案。我或多或少有相同的用例,我需要向用户发布通知,每个用户都有自己的通知。我使用了一个简单的技巧,EventSource 侦听事件,并将 userId 作为事件类型的一部分来区分用户。所以我没有在up_vote上,而是用了up_vote_userId1。我们的后端根据哪个用户有更新将事件发布到这些事件类型。我们的问题解决了。

我向你推荐JEaSSE库(Java Easy Server-Sent Events):http://mvnrepository.com/artifact/info.macias/jeasse

您可以在此处找到一些使用示例:https://github.com/mariomac/jeasse

具体来说,对于您的使用案例:

@WebServlet(asyncSupported = true)
public class ExampleServlet1 extends HttpServlet {
    SseDispatcher dispatcher;;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                                      throws ServletException, IOException {
       dispatcher = new SseDispatcher(req).ok().open();
    }
    public void onGivenEvent(String info) {
       dispatcher.send("givenEvent",info);
    }
}