Этот проект представляет собой Java-реализацию сервера Socket.IO с открытым исходным кодом. На основе серверной платформы Netty.
Лицензия Apache License 2.0.
JAR совместим с Java 8, но для создания информации о модуле требуется Java 11+.
Включите в свой список зависимостей следующее:
< dependency >
< groupId >com.corundumstudio.socketio</ groupId >
< artifactId >netty-socketio</ artifactId >
< version >2.0.12</ version >
</ dependency >
Отзывы клиентов в 2012 году :
CentOS, 1 ЦП, 4 ГБ ОЗУ, работающая на виртуальной машине: ЦП 10%, Память 15%
6000 сеансов опроса длиной в час или 15 000 сеансов веб-сокетов
4000 сообщений в секунду
Отзывы клиентов в 2014 году :
«Для стресс-тестирования решения мы одновременно запустили 30 000 клиентов веб-сокетов и сумели достичь пиковой скорости около 140 000 сообщений в секунду со средней задержкой менее 1 секунды». (c) Виктор Эндерс - Kambi Sports Solutions
Многопользовательский оркестр: multiplayer-orchestra.com
Облако AVOS: avoscloud.com
Камби Спортивные Решения: kambi.com
АРСнова: arsnova.eu
Функция — добавлена настройка EnableCors (спасибо @zd925)
Особенность - возможность определить декодер HTTP-запроса (спасибо @gurkancakir)
Исправлено: если подтверждение возвращается после триггера таймаута, будет выдано исключение IllegalStateException (спасибо @malinGH).
Исправлено — предотвращает повторное подключение клиента к пространству имен (спасибо @bigtian99).
Исправлено — по умолчанию вложения обрабатываются как двоичные (спасибо @nicsor).
Исправлено - восстанавливаемая обработка сбоев рукопожатия (спасибо @berinhardt)
Исправлено — HashedWheelTimeoutScheduler должен удалять ScheduledFutures перед выполнением задачи (спасибо @berinhardt).
Исправлено — пользовательские пространства имен поддерживают данные аутентификации (спасибо @Addi).
Исправлено - чтение буфера кадра вложений.
Исправлено — утечка памяти при сбое WebSocketServerHandshakeException или Channel (спасибо @h3mant-1).
Функция — анализ v3/v4 нескольких сообщений в одном теле HTTP-опроса (спасибо @unverbraucht)
Исправлено — ошибка IllegalReferenceCountException.
Исправлено — возможный ООМ, вызванный парсингом вложений.
Поддержка Github Actions, сделанная @liangyuanpeng
Особенность — поддержка Java-модулей (спасибо @unverbraucht)
Функция — добавлен AuthTokenListener (спасибо @unverbraucht)
Особенность — поддержка мультипакетного разделителя (спасибо @unverbraucht)
Улучшение — отправка массового события выхода вместо нескольких событий выхода при отключении (спасибо @ksahu750)
Исправлено — NPE во время таймаута ответа на подтверждение (спасибо @BlueSodaWater).
Исправлено — утечка ресурсов в методе readVersion() (спасибо @JHOANG23).
Функция - добавлена возможность добавления пар ключ-значение в хранилище сокетов во время авторизации (спасибо @shutuper)
Функция — метод getRoomOperations() с параметром room varargs (спасибо @shutuper)
Исправлено — клиент не может подключиться к пространству имен, отличному от стандартного (спасибо @lyjnew).
Исправлено — NPE в WebSocketTransport и PollingTransport (спасибо @Hunterk95).
JDK 8 — минимальная версия, необходимая для использования.
Исправлено — сообщение размером больше maxFramePayloadLength вызывало утечку памяти.
Функция — поддержка протокола SocketIO 4.x (спасибо @HashZhang)
Исправлено — добавление в пакеты всех классов, специфичных для сокетов (спасибо @rishabhgup).
Исправлено — ошибка io.netty.channel.ChannelPipelineException.
Функция — добавлен метод SocketIOClient.isWritable() (спасибо @xuwenqing04)
Функция — добавлен метод Namespace.addListeners(Iterable Listeners) (спасибо @damonxue)
Исправлено: пакет события отключения должен быть подтипом MESSAGE (спасибо @MasterShi).
Исправлено: BaseStoreFactory выдавал NPE.
Функция: добавлена поддержка массового присоединения и выхода (спасибо @ksahu750).
Исправлено - автоотключение (регресс с 1.7.22)
Функция — поддержка пинг-понга для протокола Socketio v4 (спасибо @HashZhang)
Исправлено - имя транспорта должно проверяться в верхнем регистре (регресс с 1.7.20).
Функция — добавлена настройка необходимостиClientAuth (спасибо @huws)
Исправлено: следует использовать ContinuationWebSocketFrame, если полезная нагрузка > maxFramePayloadLength (спасибо 俞伟搏).
Исправлено: класс src прослушивателя событий и целевой компонент не совпадают (спасибо @cifaz).
Исправлено - недопустимый параметр транспорта (спасибо @mirus36)
Функция — добавлены настройки writeBufferWaterMarkLow и writeBufferWaterMarkHigh (спасибо @xuminwlt)
Функция — добавлена настройкаallowHeaders (спасибо @HuangHuan)
Функция — добавлен метод getCurrentRoomSize() (спасибо @sunxiaoyu3)
Исправлено - ошибка пространства имен (спасибо @@johntyty912)
Исправлено — несколько узлов с редиссоном получали одно и то же сообщение (спасибо 梁嘉祺).
Исправлено: несколько узлов получали только одно сообщение LEAVE при отключении клиента (спасибо @GaryLeung922).
Особенность — поддержка перехватчиков событий, которые перехватывают все события (спасибо @yosiat)
Исправлено - трансляция событий пространства имён (спасибо Владимиру Маслию)
Функция — в объект Config добавлена настройка randomSession (спасибо @yuanxiangz)
Исправлено — NPE в WebSocketTransport.
Исправлено — утечка NPE и памяти (спасибо zhaolianwang).
Исправлено — парсинг пространства имен (спасибо Redliver).
Исправлено — совместимость с Redisson 3.9+.
Исправлено — обработка ACK без потокобезопасности (спасибо @dawnbreaks).
Исправлено — неактивные каналы длительного опроса вызывали утечку памяти (спасибо @dawnbreaks)
Исправлено — обработка CloseFrame веб-сокета (спасибо @hangsu.cho)
Исправлено — WebSocketTransport NPE.
Исправлено — идентификатор сеанса больше не уникален.
Исправлено — исправлено базовое соединение, которое не закрывалось по таймауту пинга.
Исправлено - проблема "fin_close"
Фишка - добавлен локальный адрес сокета для подключения (спасибо @SergeyGrigorev)
Функция — добавлен метод addPingListener
(спасибо @lovebing)
Функция — добавить ThreadFactory для HashedWheelTimer (спасибо @hand515)
Исправлено — изменен SO_LINGER для обработки как дочернего канала (а не канала сервера) (спасибо @robymus).
Исправлено — утечка ByteBuf при использовании двоичных вложений.
Исправлено — восстановление сеанса из Cookie (спасибо @wuxudong)
Исправлено — NumberFormatException, когда b64 является логическим значением (спасибо @vonway).
Исправлено - кодирование данных для транспорта опроса.
Функция — добавлена возможность изменить SSL KeyFactoryAlgorithm с помощью конфигурации (спасибо @robymus).
Улучшение - Улучшена обработка двоичных подтверждений (спасибо Сергею Бушику)
Исправлено — не удалось пометить обещание как успешное, поскольку оно уже выполнено (спасибо @robymus).
Функция: добавлен метод SocketIOServer.removeAllListeners
Функция: добавлен метод BroadcastOperations.sendEvent
с параметром excludedClient
.
Улучшение — Redisson обновлен до версии 2.4.0.
Исправлено — утечка памяти в объекте пространства имен (спасибо @CrazyIvan007).
Исправлено — ошибка выдачи, если транспорт не поддерживается.
Исправлено — отключение клиента при использовании опроса — IndexOutOfBoundsException.
Исправлено - netty обновлена до версии 4.1.0.CR3.
Исправлено — парсинг двоичных пакетов (спасибо Уинстону Ли)
Функция — поддержка сжатия
Исправлено — обработка запросов клиента DotNET.
Исправлено — анализ формата длины пакета.
Исправлено — пропуск 'd=' в пакете.
Исправлено — клиенты опроса время от времени преждевременно отключались (спасибо lpage30).
Исправлено: соединения остаются открытыми навсегда, если сервер отправил пакет close
.
Исправлено - совместимость с последней версией Redisson.
Улучшение: WebSocketServerHandshaker.allowExtensions
теперь true
.
Улучшение — реализация cookie SessionID (спасибо @ryandietrich)
Исправлено — утечка clientRooms (спасибо @andreaspalm)
Исправлено — ExceptionListener не использовался при ошибках при синтаксическом анализе JSON.
Исправлено - атака «тихого канала».
Улучшение: добавлен параметр useStrictOrdering
для строгого упорядочения пакетов веб-сокетов.
Улучшение: FAIL_ON_EMPTY_BEANS = false
установлена в декодере json.
Улучшение: нет необходимости добавлять библиотеку jackson, если вы используете собственную реализацию JsonSupport.
Исправлено — поддержка клиента SocketIO 1.3.x.
Исправлено - обработка кодировки кодировки (спасибо alim-akbachev).
Улучшение: добавлен SocketIONamespace.getName()
Исправлено — агрегация кадров WebSocket.
Исправлено — освобождение буфера WebSocket.
Исправлено: Unexpected end-of-input in VALUE_STRING
Исправлено: Access-Control-Allow-Credentials имеет значение TRUE для запросов с заголовком источника.
Функция: добавлен параметр Configuration.sslProtocol
.
Исправлено — обработка подтверждения BinaryEvent.
Исправлено: кодирование/декодирование BinaryEvent без b64.
Исправлено - утечка буфера при кодировании пакетов.
Исправлено - кодирование пакетов
Исправлено — кодирование/декодирование BinaryEvent.
Исправлено - обработка неоспоримых соединений.
Функция - добавлена настройка origin
Функция: добавлена настройка crossDomainPolicy
.
Функция — добавлен метод SocketIOServer.startAsync
Функция — поддержка Epoll
Улучшение — поддержка BinaryEvent.
Исправлено — обработка отключения SocketIOClient.
Исправлено — широковещательный обратный вызов
Исправлено: NPE не определял транспорт во время аутентификации.
Исправлено — тайм-аут пинга для транспорта опроса.
Исправлено - утечка буфера в PacketEncoder.
Исправлено — неправильная кодировка исходящего сообщения с использованием транспорта веб-сокетов.
Исправлено — NPE в транспорте веб-сокетов.
Исправлено — множественное декодирование пакетов в транспорте опроса.
Исправлено - утечка буфера
Функция — возможность установить собственный Access-Control-Allow-Origin
через Configuration.origin.
Исправлено - подключение через CLI сокет.io-клиент
Особенность — поддержка протокола Socket.IO 1.0. Благодаря новому протоколу декодирование/кодирование ускорилось.
Отброшено — методы SocketIOClient.sendMessage
, SocketIOClient.sendJsonObject
и соответствующие прослушиватели.
Отброшено — поддержка транспорта Flashsocket.
Отброшено - версия протокола 0.7...0.9.16
Улучшение — оптимизировано кодирование отдельных пакетов, используется в основном в транспорте WebSocket. Время кодирования сокращено до 40% (спасибо Виктору Эндерсу)
Улучшение - оптимизировано управление комнатами
Улучшение: добавлен метод ExceptionListener.ExceptionCaught.
Критическое изменение API : Configuration.autoAck заменен на ackMode.
Функция: добавлена настройка TrustStore.
Функция: добавлен параметр maxFramePayloadLength.
Функция: в SocketIONamespace добавлены методы getAllClients и getClient.
Исправлено: SocketIOServer.getAllClients возвращает неправильное количество клиентов.
Исправлено - проблема с выпуском сообщений
Исправлено — проблема с переопределением конфигурации прослушивателя исключений.
Нарушение изменения API : DataListener.onData теперь выдает исключение
Улучшение: в прослушиватель исключений добавлен параметр данных.
Улучшение - возможность настройки конфигурации сокета.
Улучшение — добавлен параметр Configuration.autoAck.
Исправлено — обработка AckCallback при отключении клиента.
Исправлено: HTTP-код неавторизованного рукопожатия изменен на 401.
Критическое изменение API : удален параметр Configuration.heartbeatThreadPoolSize.
Функция — поддержка аннотированных bean-компонентов Spring через SpringAnnotationScanner.
Функция - общий прослушиватель исключений
Улучшение: ScheduledExecutorService заменен на HashedWheelTimer.
Исправлено: неправильная обработка отключения клиента в пространстве имен.
Исправлено - исключение в методах onConnect/onDisconnect/isAuthorized приводило к зависанию сервера.
Критическое изменение API - изменена подпись методов SocketIOClient.sendEvent
Улучшение — поддержка событий нескольких типов через MultiTypeEventListener и аннотацию OnEvent.
Улучшение — поддержка подтверждения событий нескольких типов через MultiTypeAckCallback.
Улучшение — добавлен метод SocketIOClient.getHandshakeData.
Улучшение — джедаи заменены на Редиссона.
Исправлено: совместимость с JDK 1.6+.
Особенность - поддержка авторизации
Исправлено: транспортная регрессия при объединении XHR.
Исправлено: регрессия транспорта Websocket.
Исправлено — NPE пространства имен в PacketHandler.
Исправлено - завершение работы исполнителей при остановке сервера.
Особенность — поддержка клиентского хранилища (Memory, Redis, Hazelcast).
Функция - поддержка распределенной трансляции по узлам netty-socketio (Redis, Hazelcast).
Особенность — поддержка OSGi (спасибо rdevera)
Улучшение — оптимизация пула XHR.
Улучшение — добавлен метод SocketIOClient.getAllRooms.
Исправлено - политика flash "утечка запроса" после перезагрузки страницы (спасибо ntrp)
Исправлено - загрузка веб-сокета SWF (спасибо ntrp)
Исправлено: неправильные URL-адреса могут стать причиной потенциального DDoS-атаки.
Исправлено — видимость пакета Event.class изменена, чтобы избежать прямого использования.
Улучшение — упрощена регистрация модулей Джексона.
Исправлено — NPE во время выключения.
Улучшение: в пространство имен добавлен метод isEmpty.
Исправлено: неправильный вызов обратного вызова по тайм-ауту подтверждения.
Исправлено: сериализация bigdecimal для JSON.
Исправлено — бесконечный цикл во время исключения обработки пакетов.
Исправлено — обработка сообщения «клиент не найден».
Улучшение - оптимизация распределения буферов кодирования.
Улучшение — буферы кодирования теперь объединены в память, чтобы уменьшить нагрузку на сборщик мусора (функция netty 4.x).
Исправлено — ошибка неизвестного свойства при десериализации.
Исправлено - утечка памяти при длинном транспорте опроса.
Улучшение — регистрация информации об ошибках вместе с входящими данными.
Первый стабильный релиз.