Witam. Jestem w trakcie tworzenia bardzo prostej gry multiplayer (bez logowania), gdzie można stworzyć prywatny pokój i do niego dołączać, żeby zagrać albo dołączyć do jakiegoś publicznego. Korzystam ze spring websocket razem ze stompem. Chciałbym zrobić to tak, że wszelkie polecenia dot. pokoi (tworzenie, dołączanie, opuszczanie) idą przez zwykłe zapytania http POST albo PUT a reszta przez websocket. Nie mam szczerze pojęcia jak się za to zabrać. Chciałbym, żeby np. wyglądało to tak
- User1 wchodzi na aplikacje i łączy się z serwerem ws
- User1 tworzy pokój przez http POST i dostaje informacje zwrotną o numerze pokoju
- User2 wchodzi do pokoju przez http PUT
- Serwer websocket przesyła do każdego użytkownika w pokoju informację o tym, że user2 dołączył i zwraca jego dane
Dodatkowo na razie zrobiłem tak, że gdy ktoś na wejściu łączy się z serwerem ws to w systemie jest tworzony nowy użytkownik i jest on przypisywany do tej sesji za pomocą metody determineUser z AbstractHandshakeHandlera. Tylko, że problem jest taki, że np. podczas wykonywania zwykłego zapytania http POST nie mam oczywiście dostępu do obiektu Principal. Czyli musiałbym np. zwracać to id do klienta zaraz po wykonaniu połączeniu z serwerem ws i wtedy przesyłać je z powrotem na serwer np. przy tworzeniu pokoju. Tylko czy to wszystko ma sens? Może zrobić to całkowicie inaczej? Albo w ogóle nie wykonywać tych rzeczy dot. pokoi przez http tylko po prostu przez websocket? Jak będzie lepiej?
public class CustomHandshakeHandler extends DefaultHandshakeHandler {
private final RoomDomainFacade roomDomainFacade;
@Override
protected Principal determineUser(
ServerHttpRequest request,
WebSocketHandler wsHandler,
Map<String, Object> attributes
) {
String createdPlayerId = roomDomainFacade.createPlayer();
return new WebsocketPrincipal(createdPlayerId);
}