AngularJS ngWebscoket不向所有用户发送消息

时间:2016-02-04 14:26:19

标签: java angularjs session websocket angularjs-scope

我正在使用ngWebsocket来监听用户操作,并根据当前操作更新所有用户页面,而不仅仅是发送操作的页面。

我在java中抓住所有操作并发送消息所有打开的会话。但是当我测试时,终点查找会话并向所有人发送消息,但消息只是发送给发送动作的人。

我的java代码如

 @OnMessage
public String onMessage(Session session, String message) {    Gson gson = new Gson();
    SocketMessage sm = gson.fromJson(message, new SocketMessage().getClass());
    if (sm.getEvent().equals("teklif")) {

        Set<Session> openSessions = session.getOpenSessions();
        for (Session openSession : openSessions) {
            try {
                openSession.getBasicRemote().sendText("{\"event\":\"teklif\",\"data\":" + sm.getData() + "}");
            } catch (Exception ioe) {
                System.out.println(ioe.getMessage());
            }
        }

    }

    return message;
}`

当我调试Set<Session> openSessions = session.getOpenSessions();时,它会向我显示两个会话并向所有远程发送消息。我在我的控制器里听

 $rootScope.ws.$on('teklif', function (data) { console.log(data);

});

只显示发出消息的人

注意:我发送的信息是这样的 - &gt; $rootScope.ws.$emit('teklif', data.content);

如何让所有用户都听取所有操作的套接字?

提前致谢。

2 个答案:

答案 0 :(得分:0)

您正在使用Session.getOpenSessions()。 Javadoc说:

  

返回所有打开的Web套接字会话集的副本   表示与此会话所在的同一端点的连接   代表一个连接。 Set包含此方法的会话   拜访。这些会议可能在此之后的任何时候都不会公开   返回此方法。例如,稍后迭代该集合   时间可能产生一个或多个封闭的会话。开发人员应该使用   session.isOpen()来检查。

所以会为您提供连接到您的终端的所有客户端会话。

相反,您需要自己跟踪连接到端点的所有会话,并迭代该集合。这是一个example

答案 1 :(得分:0)

我发现我的问题是什么。

    @OnMessage
public String onMessage(Session session, String message) {

    Gson gson = new Gson();
    SocketMessage sm = gson.fromJson(message, new SocketMessage().getClass());
    if (sm.getEvent().equals("teklif")) {
        //SoncketTestMessage fromJson = gson.fromJson(test.getData(), SoncketTestMessage.class);

        Set<Session> openSessions = session.getOpenSessions();
        for (Session openSession : openSessions) {
            try {
                SocketResponse rsp = new SocketResponse();
                rsp.setEvent("teklif");
                rsp.setData(gson.toJson(sm.getData()));
                //openSession.getBasicRemote().sendText("{\"event\":\"teklif\",\"data\":" + sm.getData() + "}");
                openSession.getBasicRemote().sendText(gson.toJson(rsp, SocketResponse.class));

            } catch (Exception ioe) {
                System.out.println(ioe.getMessage());
            }
        }

    }

    return null;
}

我犯了一个错误

openSession.getBasicRemote().sendText("{\"event\":\"teklif\",\"data\":" + sm.getData() + "}");

我刚刚更改了sm.getData并发送了正确的json格式,然后发送给所有用户。

由于该函数返回消息它之前只发送给所有者,并且它是正确的格式并且只有所有者才能获得返回。现在所有用户都收到了消息。