3

アクティブなすべてのクライアントにメッセージを送信したい。

@OnMessage
public void onMessage(String message, Session session) {
    switch (message) {
    case "latencyEqualize":

        for (Session otherSession : session.getOpenSessions()) {
            RemoteEndpoint.Basic other = otherSession.getBasicRemote();
            String data = "Max latency = "
                    + LatencyEqualizer.getMaxLatency(latencies);            
            try {
                other.sendText(data);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        break;
    default:

        RemoteEndpoint.Basic other = session.getBasicRemote();          
        try {
            other.sendText(message);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

このコードには何か問題があります。最初のクライアントからメッセージ「latencyEqualize」を送信すると、サーバーは同じクライアントにのみ応答します。他のクライアントは、「Max latency = 15」というメッセージを受信しません。しかし、2 番目のクライアントがサーバーにメッセージを送信すると、"Max latency = 15" が返されます。そして、サーバーへの今後のすべての呼び出しは、前の呼び出しからのメッセージを返します。

これを回避する方法はありますか。いずれかのクライアントが「latencyEqualize」メッセージをサーバーに送信すると、すべてのクライアントが「Max latency」メッセージを受け取るようにします。

4

1 に答える 1

10

メッセージを受信するクライアントが 1 つだけである理由は、メッセージsessionを送信したクライアントの接続のみが変数に含まれているためです。

メッセージをすべてのクライアントに送信するには、接続をメソッド内のコレクション ( などArrayList<Session>) に保存しonOpen()、そのコレクションを反復処理してすべてのクライアントの接続を取得します。

于 2015-07-08T12:11:58.227 に答える