This project is a fork of netty-socketio, which is no longer actively maintained. The fork aims to keep the library up-to-date with the latest dependencies and improvements, ensuring continued support and functionality for users.
- There is a branch for merging the latest changes from the original repository:
merge-to-source-master, and an Open PR: mrniko#1057 - The main development branch is
main, which contains the latest features and fixes. - The main stream version has a separate branch, for example
3.x - This project is an open-source Java implementation of Socket.IO server. Based on Netty server framework.
Licensed under the Apache License 2.0.
3.0.0 is the same as 2.0.13 with split modules, integration tests, and some CI/CD improvements. Replace old dependency:
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>2.0.13</version>
</dependency>with new one:
<dependency>
<groupId>io.github.neatguycoding</groupId>
<artifactId>netty-socketio-core</artifactId>
<version>LATEST-VERSION</version>
</dependency>If you use Spring integration (Just one class: SpringAnnotationScanner), you should use the new dependency:
<dependency>
<groupId>io.github.neatguycoding</groupId>
<artifactId>netty-socketio-spring</artifactId>
<version>LATEST-VERSION</version>
</dependency>Please refer to netty-socketio-examples module: netty-socketio-examples
- 1.x - 4.x version of Socket.IO-client is supported
- Supports xhr-polling transport
- Supports websocket transport
- Supports namespaces and rooms
- Supports ack (acknowledgment of received data)
- Supports SSL
- Supports client store (Redisson, Hazelcast, Memory)
- Supports distributed broadcast across netty-socketio nodes (Redisson, Hazelcast)
- Supports OSGi
- Supports Spring
- Supports Quarkus
- Supports Micronaut
- Contains Java module info for JPMS.
- Lock-free and thread-safe implementation
- Declarative handler configuration via annotations
JAR is compatible with Java 8 but needs Java 11+ for building the module-info.
Customer feedback in 2012:
CentOS, 1 CPU, 4GB RAM runned on VM:
CPU 10%, Memory 15%
6000 xhr-long polling sessions or 15000 websockets sessions
4000 messages per second
Customer feedback in 2014:
"To stress test the solution we run 30 000 simultaneous websocket clients and managed to peak at total of about 140 000 messages per second with less than 1 second average delay." (c) Viktor Endersz - Kambi Sports Solutions
For more details, please refer to daily smoke tests results: PERFORMANCE_REPORT.md
Multiplayer Orchestra: multiplayer-orchestra.com
AVOS Cloud: avoscloud.com
Kambi Sports Solutions: kambi.com
ARSnova: arsnova.eu
Refer to: https://mvnrepository.com/artifact/io.github.neatguycoding/netty-socketio
- Feature - Split to core, spring, quarkus, and micronaut modules
- Feature - add TestContainers Based tests
- Feature - add daily smoke tests
- Feature - add GitHub Actions CI/CD
Refer to: https://mvnrepository.com/artifact/com.corundumstudio.socketio/netty-socketio
Fixed - Socket.IO Client v2 fails to connect (thanks to @penguinlab)
Fixed - Support for v1 / readNamespace. V1 namespace is without special characters , or ? (thanks to @Pacl0)
Feature - enableCors setting added (thanks to @zd925)
Feature - ability to define http request decoder (thanks to @gurkancakir)
Fixed - if ack returns after the timeout trigger ,a IllegalStateException will be thrown (thanks to @malinGH)
Fixed - prevents the client from repeatedly connecting to the namespace (thanks to @bigtian99)
Fixed - treat attachments as binary by default (thanks to @nicsor)
Fixed - recoverable handshake failure handling (thanks to @berinhardt)
Fixed - HashedWheelTimeoutScheduler should remove scheduledFutures before task execution (thanks to @berinhardt)
Fixed - custom namespaces support auth data (thanks to @Addi)
Fixed - attachments frame buffer reading
Fixed - memory leak while WebSocketServerHandshakeException or Channel failed (thanks to @h3mant-1)
Feature - v3/v4 parsing of multiple messages in one HTTP polling body (thanks to @unverbraucht)
Fixed - IllegalReferenceCountException error
Fixed - possible OOM caused by attachments parsing
Github Actions support made by @liangyuanpeng
Feature - Java module support (thanks to @unverbraucht)
Feature - AuthTokenListener added (thanks to @unverbraucht)
Feature - multi-packet separator support (thanks to @unverbraucht)
Improvement - Send Bulk leave event instead of multiple leave events on disconnect (thanks to @ksahu750)
Fixed - NPE during ack response timeout (thanks to @BlueSodaWater)
Fixed - Resource Leak in readVersion() method (thanks to @JHOANG23)
Feature - added availability to add key-value pairs to socket store during authorization (thanks to @shutuper)
Feature - getRoomOperations() method with room varargs param (thanks to @shutuper)
Fixed - client can't connect to non-default namespace (thanks to @lyjnew)
Fixed - NPE in WebSocketTransport and PollingTransport (thanks to @Hunterk95)
JDK 8 is minimum version required for usage.
Fixed - message larger than maxFramePayloadLength causes memory leak
Feature - SocketIO 4.x protocol support (thanks to @HashZhang)
Fixed - add all the socketio specific classes to bundles (thanks to @rishabhgup)
Fixed - io.netty.channel.ChannelPipelineException error
Feature - SocketIOClient.isWritable() method added (thanks @xuwenqing04)
Feature - Namespace.addListeners(Iterable listeners) method added (thanks @damonxue)
Fixed - disconnect event packet should be a subtype of MESSAGE (thanks @MasterShi)
Fixed - BaseStoreFactory throws NPE
Feature - Added support for bulk join and leave (thanks @ksahu750)
Fixed - auto disconnected (regression since 1.7.22)
Feature - ping/pong support for socketio v4 protocol (thanks to @HashZhang)
Fixed - transport name should be checked in uppercase (regression since 1.7.20)
Feature - needClientAuth setting added (thanks to @huws)
Fixed - ContinuationWebSocketFrame should be used if payload > maxFramePayloadLength (thanks to 俞伟搏)
Fixed - event listener src class and dest bean is no match (thanks to @cifaz)
Fixed - illegal transport parameter (thanks to @mirus36)
Feature - writeBufferWaterMarkLow and writeBufferWaterMarkHigh settings added (thanks to @xuminwlt)
Feature - allowHeaders setting added (thanks to @HuangHuan)
Feature - getCurrentRoomSize() method added (thanks to @sunxiaoyu3)
Fixed - namespace bug (thanks to @@johntyty912)
Fixed - multiple nodes with redisson receive same message (thanks to 梁嘉祺)
Fixed - multiple nodes receive only one LEAVE msg on client disconnect (thanks to @GaryLeung922)
Feature - support for event interceptors which catch all events (thanks to @yosiat)
Fixed - namespace event broadcasting (thanks to Volodymyr Masliy)
Feature - randomSession setting added to Config object (thanks to @yuanxiangz)
Fixed - NPE in WebSocketTransport
Fixed - NPE & memory leak (thanks to zhaolianwang)
Fixed - namespace parsing (thanks to Redliver)
Fixed - Redisson 3.9+ compatibility
Fixed - non thread-safe ACK handling (thanks to @dawnbreaks)
Fixed - inactive long-polling channels cause memory leak (thanks to @dawnbreaks)
Fixed - websocket CloseFrame processing (thanks to @hangsu.cho)
Fixed - WebSocketTransport NPE
Fixed - Session ID is not unique anymore
Fixed - fixed underlying connection not closing on ping timeout
Fixed - the "fin_close" problem
Feature - added local socket address for the connection (thanks to @SergeyGrigorev)
Feature - addPingListener method added (thanks to @lovebing)
Feature - add ThreadFactory for HashedWheelTimer (thanks to @hand515)
Fixed - changed SO_LINGER to be handled as child channel (not server channel) option (thanks to @robymus)
Fixed - ByteBuf leak if binary attachments are used
Fixed - restore session from Cookie (thanks to @wuxudong)
Fixed - NumberFormatException when b64 is bool value (thanks to @vonway)
Fixed - data encoding for polling transport
Feature - Added option to change the SSL KeyFactoryAlgorithm using Configuration (thanks to @robymus)
Improvement - Binary ack handling improvements (thanks to Sergey Bushik)
Fixed - Failed to mark a promise as success because it has succeeded already (thanks to @robymus)
Feature - SocketIOServer.removeAllListeners method added
Feature - BroadcastOperations.sendEvent method with excludedClient param added
Improvement - Redisson updated to 2.4.0
Fixed - memory leak in Namespace object (thanks to @CrazyIvan007)
Fixed - Throw error if transport not supported
Fixed - Client disconnecting when using Polling - IndexOutOfBoundsException
Fixed - netty updated to 4.1.0.CR3 version
Fixed - binary packet parsing (thanks to Winston Li)
Feature - Compression support
Fixed - DotNET client request handling
Fixed - Packet length format parsing
Fixed - skipping 'd=' in packet
Fixed - Polling clients sporadically get prematurely disconnected (thanks to lpage30)
Fixed - connections stay open forever if server sent close packet
Fixed - compatibility with Redisson latest version
Improvement - WebSocketServerHandshaker.allowExtensions is true now
Improvement - SessionID cookie implementation (thanks to @ryandietrich)
Fixed - clientRooms leak (thanks to @andreaspalm)
Fixed - ExceptionListener not used for errors in JSON parsing
Fixed - "silent channel" attack
Improvement - useStrictOrdering param added for websocket packets strict ordering
Improvement - FAIL_ON_EMPTY_BEANS = false option setted in json decoder
Improvement - no need to add jackson lib if you use own JsonSupport impl
Fixed - SocketIO client 1.3.x support
Fixed - Charset encoding handling (thanks to alim-akbashev)
Improvement - SocketIONamespace.getName() added
Fixed - WebSocket frames aggregation
Fixed - WebSocket buffer release
Fixed - Unexpected end-of-input in VALUE_STRING error
Fixed - Access-Control-Allow-Credentials is TRUE for requests with origin header
Feature - Configuration.sslProtocol param added
Fixed - BinaryEvent ack handling
Fixed - BinaryEvent non b64 encoding/decoding
Fixed - buffer leak during packet encoding
Fixed - packet encoding
Fixed - BinaryEvent encoding/decoding
Fixed - unchallenged connections handling
Feature - origin setting added
Feature - crossDomainPolicy setting added
Feature - SocketIOServer.startAsync method added
Feature - Epoll support
Improvement - BinaryEvent support
Fixed - SocketIOClient disconnect handling
Fixed - broadcast callback
Fixed - NPE then no transport defined during auth
Fixed - ping timeout for polling transport
Fixed - buffer leak in PacketEncoder
Fixed - wrong outgoing message encoding using websocket transport
Fixed - NPE in websocket transport
Fixed - multiple packet decoding in polling transport
Fixed - buffer leak
Feature - ability to set custom Access-Control-Allow-Origin via Configuration.origin
Fixed - connection via CLI socket.io-client
Feature - Socket.IO 1.0 protocol support. Thanks to the new protocol decoding/encoding has speedup
Dropped - SocketIOClient.sendMessage, SocketIOClient.sendJsonObject methods and corresponding listeners
Dropped - Flashsocket transport support
Dropped - protocol version 0.7 ... 0.9.16
Improvement - single packet encoding optimized, used mostly in WebSocket transport. Encoding time reduced up to 40% (thanks to Viktor Endersz)
Improvement - rooms handling optimized
Improvement - ExceptionListener.exceptionCaught method added
Breaking api change - Configuration.autoAck replaced with ackMode
Feature - trustStore setting added
Feature - maxFramePayloadLength setting added
Feature - getAllClients and getClient methods added to SocketIONamespace
Fixed - SocketIOServer.getAllClients returns wrong clients amount
Fixed - message release problem
Fixed - problem with exception listener configuration redefinition
Breaking api change - DataListener.onData now throws Exception
Improvement - data parameter added to exception listener
Improvement - ability to setup socket configuration
Improvement - Configuration.autoAck parameter added
Fixed - AckCallback handling during client disconnect
Fixed - unauthorized handshake HTTP code changed to 401
Breaking api change - Configuration.heartbeatThreadPoolSize setting removed
Feature - annotated Spring beans support via SpringAnnotationScanner (available in netty-socketio-spring module)
Feature - common exception listener
Improvement - ScheduledExecutorService replaced with HashedWheelTimer
Fixed - wrong namespace client disconnect handling
Fixed - exception in onConnect/onDisconnect/isAuthorized methods leads to server hang
Breaking api change - SocketIOClient.sendEvent methods signature changed
Improvement - multi type events support via MultiTypeEventListener and OnEvent annotation
Improvement - multi type events ack support via MultiTypeAckCallback
Improvement - SocketIOClient.getHandshakeData method added
Improvement - Jedis replaced with Redisson
Fixed - JDK 1.6+ compatibility
Feature - authorization support
Fixed - XHR-pooling transport regression
Fixed - Websocket transport regression
Fixed - namespace NPE in PacketHandler
Fixed - executors shutdown during server stop
Feature - client store (Memory, Redis, Hazelcast) support
Feature - distributed broadcast across netty-socketio nodes (Redis, Hazelcast) support
Feature - OSGi support (thanks to rdevera)
Improvement - XHR-pooling optimization
Improvement - SocketIOClient.getAllRooms method added
Fixed - flash policy "request leak" after page reload (thanks to ntrp)
Fixed - websocket swf loading (thanks to ntrp)
Fixed - wrong urls causes a potential DDoS
Fixed - Event.class package visibility changed to avoid direct usage
Improvement - Simplified Jackson modules registration
Fixed - NPE during shutdown
Improvement - isEmpty method added to Namespace
Fixed - wrong ack timeout callback invocation
Fixed - bigdecimal serialization for JSON
Fixed - infinity loop during packet handling exception
Fixed - 'client not found' handling
Improvement - encoding buffers allocation optimization.
Improvement - encoding buffers now pooled in memory to reduce GC pressure (netty 4.x feature).
Fixed - error on unknown property during deserialization.
Fixed - memory leak in long polling transport.
Improvement - logging error info with inbound data.
First stable release.