1

私のアプリケーションには、接続されているすべてのセッションを接続時に保存し、適切に切断された場合は削除するセッションハンドラーがあります。そうでない場合はセッションを維持し、再接続した場合は古いセッションを新しいセッションに置き換えます。(以下のコードはばかげているように見えますが、私の主張を説明するためのものです)

@ServerEndpoint(value = "/games")
public class GameEndPoint {

    @Inject
    private GameSessionHandler sessionHandler;

    @OnOpen
    public void open(Session session) {
        sessionHandler.addSession(session);
    }

    @OnClose
    public void close(Session session, CloseReason closeReason) {
        sessionHandler.sessionClosed(session, closeReason.getCloseCode());
    }

    @OnError
    public void onError(Throwable error) {
        LOGGER.log(Level.SEVERE, "Socket connection error", error);
    }

    @OnMessage
    public String handleMessage(String payload, Session session) {
        return payload;
    }
}

@Singleton
public class GameSessionHandler implements Serializable {

    private final Set<Session> sessions = new HashSet<>();

    public void addSession(Session session) {
        for(Session existing: sessions) {
            if(existing.equals(session)) {//DOES NOT WORK
                //client reconnected!
                sessions.remove(existing);
                break;
            }
        }
        sessions.add(session);
    }

    public void removeSession(Session session) {
        if (CloseReason.CloseCodes.NORMAL_CLOSURE.equals(reason)) {
            sessions.remove(session)
        }
    }
}

問題は、セッションが以前に接続されたクライアント用であることを確認して、セッションを新しく開いたセッションに置き換えることができるかどうかです。

編集:私のクライアントは、ユーザーがページを更新/ナビゲートできる html5 アプリケーションであり、その後接続が失われるため、これが必要です。彼が再接続しようとするときはいつでも、彼が現在プレイしているゲームを知りたい. ユーザーが不安定な接続 (携帯電話など) を使用している場合、接続が時々失われます。

4

1 に答える 1

1

これを十分に確認することができないため、接続時に一意の文字列 (uuid) をクライアントに送信することになりました。クライアントが古い uuid を与えるクエリ パラメータに接続する場合、これを使用してクライアントが誰であるかを特定します。私はクライアントが彼の言うとおりの人物であることを信頼しています。とにかく、このuuidを使用した古いセッションが切断された場合にのみ、彼はこのuuidに接続できます。

私はセキュリティをまったく考慮していません。共有 uuid を知っているのはサーバーとクライアントだけです。

于 2016-01-27T20:15:35.783 に答える