Как прикрепить данные к соединению сокета, чтобы получить эти данные на `SessionDisconnectEvent`? - PullRequest
1 голос
/ 26 апреля 2019

Чего я хочу достичь

Я хочу получить строковую переменную, которую я использую как @DestinationVariable, называемую lobbyName, когда сокет отключается с помощью @EventListener на стороне сервера:

@Component
public class WebSocketEventListener {

    private SimpMessageSendingOperations messagingTemplate;

    public WebSocketEventListener(SimpMessageSendingOperations messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @EventListener
    public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
        //here I want to get my data
    }
}

Моя проблема

Я пытался получить lobbyName, используя SessionDisonnectEvent, но я не знаю, как, когда и где поместить этот lobbyName, чтобы он был в SessionDisconnectEvent.

Что я пытался

На стороне сервера:

@Controller
public class WebSocketController {

    private final SimpMessagingTemplate template;

    WebSocketController(SimpMessagingTemplate template) {
        this.template = template;
    }

    public void pokeLobby(@DestinationVariable String lobbyName, SocketMessage message) {
//        This didn't work 
//        Map<String, Object> headers = new HashMap<>();
//        headers.put("lobbyName", lobbyName);
//        this.template.convertAndSend("/lobby/"+lobbyName.toLowerCase(), message, headers);
        this.template.convertAndSend("/lobby/"+lobbyName.toLowerCase(), message);
    }
}

Можно ли это делать на стороне клиента? :

  connectToLobbyWebSocket(lobbyName: string): void {
    const ws = new SockJS(this.addressStorage.apiAddress + '/socket');
    this.stompClient = Stomp.over(ws);
    // this.stompClient.debug = null;
    const that = this;
    this.stompClient.connect({}, function () {
      that.stompClient.subscribe('/lobby/' + lobbyName, (message) => {
        if (message.body) {
          that.socketMessage.next(message.body); //client logic
        }
      });
    });
  }

РЕДАКТИРОВАТЬ (прогресс)

Поскольку я легко могу получить sessionId на SessionDisconnectEvent, я решил изменить sessionId (после рукопожатия) на что-то вроде playerId:lobbyName:uuid Я не чувствую себя очень комфортно с этим решением, поэтому, если у вас есть какие-либо предложения, я весь слух.

const ws = new SockJS(this.addressStorage.apiAddress + '/socket', null, {
  sessionId: function (): string {
    return that.authManager.playerId + ':' + lobbyName + ':' + uuid();
  }
});
...