Server Sent Event如何向特定客户端发送响应

YM-*_*-91 3 javascript client-server push-notification server-sent-events server

在Server Sent Event中,它始终向所有客户端发送相同的响应.但我想知道的是,如何使用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'
        })
});
Run Code Online (Sandbox Code Playgroud)

我想仅向特定用户显示此通知.不适合每一个人.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();
Run Code Online (Sandbox Code Playgroud)

bay*_*ezy 5

您只向所有客户端发送相同消息的原因是因为您只有一个它们都连接到的通道.这EventSource只是一个GET你要离开的请求.像任何获取请求一样,您可以通过几种方式让特定用户定制它.

var eventSource = new EventSource("HelloServlet?username=their-user-name");
Run Code Online (Sandbox Code Playgroud)

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

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

var eventSource = new EventSource("HelloServlet");
Run Code Online (Sandbox Code Playgroud)

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

这有帮助吗?

  • @RamazanPolat - 当用户连接时,他们正在创建与您的服务器的连接,该连接保持打开状态。当它们连接时,您正在决定它们连接到哪个通道。执行的代码是标准的服务器端代码。因此,您可以执行与呈现 HTML 页面或响应 REST 调用时相同的所有操作。所以回答你的问题:(1)是的。(2) 创建 EventSource 时,您需要创建一个包含该会话 ID 的命名通道。发布时,您需要知道该 ID 并发布到该频道。 (2认同)