Сообщение не будет отправлено, потому что сеанс WebSocket был закрыт - PullRequest
0 голосов
/ 16 июня 2019

Я хотел бы создать простую систему чата с WebSocket.

Если 1 пользователь закрывает соединение, все работает нормально, и я не получаю никаких ошибок, но я получаю ошибку, если я подключен ксервер в 1 браузере с несколькими вкладками.Поэтому, если я закрываю браузер, я получаю следующую ошибку:

Причина: java.lang.IllegalStateException: сообщение не будет отправлено, поскольку сеанс WebSocket был закрыт

@OnClose
public void handleClose(Session userSession) throws IOException {
    synchronized (users) {
        users.remove(userSession);
        // Post the message
        for (Session user : users) {
            if (user.isOpen()) {
                postMessage();

                Data data = new Data("quit", currentTime, (String) userSession.getUserProperties().get("username"), "null", "null", new ArrayList<>(), new ArrayList<>(), "null");
                if (!Objects.requireNonNull(Database.getData("SELECT * FROM users WHERE username = '" + userSession.getUserProperties().get("username") + "'", this.user)).isEmpty()) {
                    data = new Data("quit", this.currentTime, (String) userSession.getUserProperties().get("username"), "null", "true", new ArrayList<>(), new ArrayList<>(), "null");
                }
                try {
                    user.getBasicRemote().sendText(gson.toJson(data));
                }
                catch (IOException e) {
                    System.out.println(e.getLocalizedMessage());
                }
            }
        }
    }
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Я нашел решение:

if (user.isOpen()) { должно быть прямо перед user.getBasicRemote().sendText(gson.toJson(data));.

Это работает, но я понятия не имею, ПОЧЕМУ это работает.Если вы знаете это, пожалуйста, оставьте комментарий.

0 голосов
/ 16 июня 2019

Убедитесь, что вы соблюдаете спецификацию websocket, особенно при отправке закрытых фреймов смотрите спецификацию здесь . Во-вторых, убедитесь, что при проверке состояния "isOpen" ваш пользователь (тот, кто закрыл страницу) "isOpen"состояние ложное.И, возможно, если вы подключены из нескольких вкладок, это происходит:


  1. Вы закрываете свой браузер с 2 вкладками
  2. handleClose сработало
  3. Удалитьпользователь из первой вкладки
  4. Отправить сообщение всем пользователям, кроме пользователя первой вкладки, включая пользователя второй вкладки (уже закрыт) * ​​1013 *
  5. Получена ошибка

Надеюсь, что это было полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...