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

时间:2016-01-25 12:17:36

标签: javascript push-notification server client-server server-sent-events

在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'
        })
});

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

var eventSource = new EventSource("HelloServlet");

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

这有帮助吗?

答案 1 :(得分:1)

我建议您使用JEaSSE库(Java Easy Server发送事件):http://mvnrepository.com/artifact/info.macias/jeasse

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

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

<Feb 24, 2016 5:18:42 PM IST> <Warning> <HTTP> <BEA-101162> <User defined listener com.sun.faces.config.ConfigureListener failed: com.sun.faces.config
.ConfigurationException: CONFIGURATION FAILED! org.ajax4jsf.renderkit.ChameleonRenderKitFactory.
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.ajax4jsf.renderkit.ChameleonRenderKitFactory
        at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:214)
        at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:200)
        at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:678)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)

答案 2 :(得分:-2)

我知道该职位非常老,但仍然值得一提解决此问题的方法。我或多或少有相同的用例,需要向用户发布通知,每个用户都有自己的通知。 我使用了一个简单的技巧,即EventSource侦听事件,并将userId附加为事件类型的一部分,以区分用户。 因此,我使用up_vote_userId1代替up_vote。我们基于哪个用户进行更新的后端将事件发布为这些事件类型。我们的问题解决了。