1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xxssyyyyssxx-jfinal-websocket

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

jfinal-websocket

Проект представляет собой:

jfinal-websocket — это проект, который позволяет разрабатывать websocket на основе javax.websocket. Он предназначен для использования в серверных приложениях, где необходимо уведомлять клиентов об изменениях данных, например, в веб-чатах или других сценариях, где требуется двусторонняя связь между сервером и клиентом.

Проект может заменить технологию опроса AJAX в сценариях активного уведомления сервера. В таких случаях он может значительно упростить архитектуру приложения.

При разработке WebSocket могут возникнуть две проблемы:

  1. Как хранить Session?
  2. Как реализовать кластеризацию?

В проекте предлагается использовать интерфейс WebSocketManager для управления сессиями. Этот интерфейс предоставляет методы для работы с сессиями, такие как получение, хранение, удаление и т. д. Интерфейс также поддерживает как одиночные, так и кластерные конфигурации.

public interface WebSocketManager {
    /**
     * В контейнере имя
     */
    String WEBSOCKET_MANAGER_NAME = "webSocketManager";

    /**
     * Получение WebSocket по идентификатору
     * @param identifier Идентификатор
     * @return WebSocket
     */
    WebSocket get(String identifier);

    /**
     * Сохранение WebSocket в памяти
     * @param identifier Идентификатор
     * @param webSocket WebSocket
     */
    void put(String identifier, WebSocket webSocket);

    /**
     * Удаление WebSocket из памяти
     * @param identifier Идентификатор
     */
    void remove(String identifier);

    /**
     * Получение всех сохранённых WebSocket на текущей машине
     * @return Map<String, WebSocket>
     */
    Map<String, WebSocket> localWebSocketMap();

    /**
     * Подсчёт количества онлайн-пользователей
     * @return Количество пользователей
     */
    default int size() {
        return localWebSocketMap().size();
    }

    /**
     * Отправка сообщения определённому пользователю
     * @param identifier Идентификатор пользователя
     * @param message Сообщение
     */
    void sendMessage(String identifier, String message);

    /**
     * Широковещательная рассылка сообщения всем пользователям
     * @param message Сообщение
     */
    void broadcast(String message);

    /**
     * Обработка сообщений от WebSocket
     * @param identifier Идентификатор пользователя
     * @param message Полученное сообщение
     */
    void onMessage(String identifier, String message);

    /**
     * Определение, является ли полученное сообщение ping-запросом
     * @param identifier Идентификатор пользователя
     * @param message Полученное сообщение
     * @return Является ли сообщение ping-запросом
     */
    default boolean isPing(String identifier, String message) {
        return "ping".equalsIgnoreCase(message);
    }

    /**
     * Ответ на ping-запрос
     * @param identifier Идентификатор пользователя
     * @param message Отправленное сообщение
     * @return Ответное сообщение pong
     */
    default String pong(String identifier, String message) {
        return "pong";
    }
}

Кластерная версия основана на функции публикации и подписки Redis. Это решение было выбрано из-за невозможности сериализации WebSocket Session.

Использование интерфейса WebSocketManager позволяет поддерживать как одиночную конфигурацию (на основе памяти), так и кластерную (на основе Redis).

Архитектура программного обеспечения

  1. Проект основан на WebSocket и предоставляет функции управления состоянием WebSocket session. Поддерживает как одиночный режим, так и кластеризацию.

  2. Можно настроить собственные ServerEndPoint и WebSocketManager.

Для разработки WebSocket с использованием SpringBoot рекомендуется обратиться к документации на сайте https://gitee.com/xxssyyyyssxx/websocket-springboot-starter.

Инструкция по установке

До версии 1.0.0 проект можно было найти в центральном репозитории Maven. Для этого использовалась команда:

compile 'top.jfunc.websocket:jfinal-websocket:1.0.0'

Начиная с версии 1.0.1, проект доступен через JitPack:

maven { url 'https://jitpack.io' }

compile 'com.gitee.xxssyyyyssxx:jfinal-websocket:v1.0.1'

Инструкции по использованию проекта доступны на сайте https://gitee.com/xxssyyyyssxx/jfinal-websocket-demo.

Использование

  1. Необходимо настроить WebSocketHandler, чтобы исключить маршрутизацию JFinal. Пример кода:
/**
 * Обработчик запросов на переход
 */
@Override
public void configHandler(Handlers me) {
  me.add(new WebSocketHandler("^/websocket"));
}
  1. Настроить WebSocketManager. Для этого необходимо вызвать соответствующие методы класса в методе afterJFinalStart или onStart. Пример кода:
public class WebSocketManagerConfig {
  /**
   * Одиночная конфигурация на основе памяти
   */
  public static void configMemory() {
    WebSocketManagerUtil.setWebSocketManager(new MemWebSocketManager());
  }

  /**
   * Кластерная конфигурация на основе Redis
   */
  public static void configCluster(Jedis jedis) {
    jedis.subscribe(new Subscriber(), RedisWebSocketManager.CHANNEL);
    WebSocketManagerUtil.setWebSocketManager(new RedisWebSocketManager(jedis));
  }

  /**
   * Настройка проверки сердцебиения
   * @param period интервал времени
   * @param timeSpan временной интервал
   * @param errorTolerant количество ошибок, которые можно допустить
   * @param todoAtRemoved что делать при удалении
   */ **Исполнители.newScheduledThreadPool(1).scheduleAtFixedRate(()->{
                новый WebSocketHeartBeatChecker().check(
                        WebSocketManagerUtil.getWebSocketManager() ,
                timeSpan , errorTolerant, todoAtRemoved);
            } , 0 , period , TimeUnit.SECONDS);
        }**

Код создаёт новый пул потоков с одним исполнителем и планирует выполнение задачи с фиксированной периодичностью. Задача представляет собой анонимный внутренний класс, который вызывает метод check() объекта WebSocketHeartBeatChecker. Метод check() принимает три аргумента: WebSocketManager, timeSpan и errorTolerant. Также в задаче есть параметр todoAtRemoved, но его значение не используется.

Задача будет выполняться каждые period секунд, начиная с момента вызова метода scheduleAtFixedRate().

* * *

**3. 配置端点,调用相应的方法**

**@ServerEndpoint("/websocket/{identifier}")**

Аннотация @ServerEndpoint указывает, что класс WebSocketServerEndPoint является сервером веб-сокетов. Параметр /{identifier} определяет путь к серверу веб-сокетов, где {identifier} — это переменная, которая будет заменена на фактическое значение при обращении к серверу.

**public class WebSocketServerEndPoint extends BaseWebSocketEndpoint {**

Класс WebSocketServerEndPoint расширяет базовый класс BaseWebSocketEndpoint. В этом классе будут определены методы обработки событий, связанных с веб-сокетами.

**@OnOpen**

Метод onOpen вызывается при открытии соединения с клиентом. В этот метод передаётся объект Session, представляющий соединение, и строка identifier, содержащая идентификатор клиента.

**@OnClose**

Метод onClose вызывается при закрытии соединения с клиентом. В этот метод также передаётся объект Session и строка identifier.

**@OnMessage**

Метод onMessage вызывается при получении сообщения от клиента. В этот метод передаются сообщение, объект Session и идентификатор клиента.

* * *

**4. Использование WebSocketManagerUtil для получения WebSocketManager**

В данном коде не указано, как именно используется WebSocketManagerUtil, поэтому перевод невозможен.

* * *

**5. Если необходимо, можно написать один или несколько слушателей для отслеживания событий подключения и отключения клиентов**

Слушатели представляют собой классы, которые реализуют интерфейс ApplicationListener. Они могут быть использованы для обработки различных событий, происходящих в приложении.

Для того чтобы зарегистрировать слушателя, необходимо вызвать метод scanPackage() или addListener() класса EventInitializer. Эти методы принимают пакет, в котором находится слушатель, или сам слушатель соответственно.

После регистрации слушателя необходимо вызвать метод start() класса EventInitializer, чтобы начать сканирование пакетов или обработку событий.

Пример кода показывает, как можно создать слушателя для событий подключения и отключения клиентов. Слушатель DemoListener реализует интерфейс ApplicationListener и переопределяет метод onApplicationEvent(). В этом методе можно выполнить необходимые действия при возникновении события.

Чтобы зарегистрировать этот слушатель, необходимо вызвать метод addListener() класса EventInitializer и передать ему экземпляр DemoListener. Затем нужно вызвать метод start(), чтобы начать обработку событий.

* * *

**6. Если используется Nginx в качестве балансировщика нагрузки, то необходимо добавить несколько заголовков в конфигурацию**

Конфигурация Nginx должна содержать следующие заголовки:

    * proxy_http_version 1.1;
    * proxy_set_header Upgrade $http_upgrade;
    * proxy_set_header Connection "upgrade";
    * proxy_read_timeout 3600s.

Эти заголовки необходимы для того, чтобы Nginx мог корректно обрабатывать запросы, связанные с веб-сокетами. Заголовок proxy_http_version устанавливает версию протокола HTTP, используемого для запросов. Заголовки proxy_set_header определяют значения заголовков запроса, которые будут переданы на сервер. Заголовок proxy_read_timeout устанавливает время ожидания ответа от сервера.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xxssyyyyssxx-jfinal-websocket.git
git@api.gitlife.ru:oschina-mirror/xxssyyyyssxx-jfinal-websocket.git
oschina-mirror
xxssyyyyssxx-jfinal-websocket
xxssyyyyssxx-jfinal-websocket
master