私のアプリケーションには、接続されているすべてのセッションを接続時に保存し、適切に切断された場合は削除するセッションハンドラーがあります。そうでない場合はセッションを維持し、再接続した場合は古いセッションを新しいセッションに置き換えます。(以下のコードはばかげているように見えますが、私の主張を説明するためのものです)
@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 アプリケーションであり、その後接続が失われるため、これが必要です。彼が再接続しようとするときはいつでも、彼が現在プレイしているゲームを知りたい. ユーザーが不安定な接続 (携帯電話など) を使用している場合、接続が時々失われます。