Este projeto é uma implementação Java de código aberto do servidor Socket.IO. Baseado na estrutura do servidor Netty.
Licenciado sob a Licença Apache 2.0.
JAR é compatível com Java 8, mas precisa de Java 11+ para construir as informações do módulo.
Inclua o seguinte em sua lista de dependências:
< dependency >
< groupId >com.corundumstudio.socketio</ groupId >
< artifactId >netty-socketio</ artifactId >
< version >2.0.12</ version >
</ dependency >
Feedback do cliente em 2012 :
CentOS, 1 CPU, 4 GB de RAM executado em VM: CPU 10%, memória 15%
6.000 sessões de pesquisa com duração de x horas ou 15.000 sessões de websockets
4.000 mensagens por segundo
Feedback do cliente em 2014 :
"Para testar a solução, executamos 30.000 clientes websocket simultâneos e conseguimos atingir um pico total de cerca de 140.000 mensagens por segundo com atraso médio inferior a 1 segundo." (c) Viktor Endersz - Kambi Sports Solutions
Orquestra Multijogador: multiplayer-orchestra.com
Nuvem AVOS: avoscloud.com
Soluções Kambi Sports: kambi.com
ARSnova: arsnova.eu
Recurso - configuração enableCors adicionada (graças a @ zd925)
Recurso - capacidade de definir o decodificador de solicitação http (graças a @gurkancakir)
Corrigido - se ack retornar após o disparo de tempo limite, uma IllegalStateException será lançada (graças a @malinGH)
Corrigido – evita que o cliente se conecte repetidamente ao namespace (graças a @bigtian99)
Corrigido – trata os anexos como binários por padrão (graças a @nicsor)
Corrigido - tratamento de falha de handshake recuperável (graças a @berinhardt)
Corrigido – HashedWheelTimeoutScheduler deveria remover ScheduledFutures antes da execução da tarefa (graças a @berinhardt)
Corrigido – namespaces personalizados suportam dados de autenticação (graças a @Addi)
Corrigido – leitura do buffer de quadros de anexos
Corrigido - vazamento de memória enquanto WebSocketServerHandshakeException ou Channel falhava (graças a @h3mant-1)
Recurso - análise v3/v4 de múltiplas mensagens em um corpo de pesquisa HTTP (graças a @unverbraucht)
Corrigido - erro IllegalReferenceCountException
Corrigido – possível OOM causado pela análise de anexos
Suporte ao Github Actions feito por @liangyuanpeng
Recurso - suporte ao módulo Java (graças a @unverbraucht)
Recurso - AuthTokenListener adicionado (graças a @unverbraucht)
Recurso - suporte para separador de vários pacotes (graças a @unverbraucht)
Melhoria – Enviar eventos de saída em massa em vez de vários eventos de saída ao desconectar (graças a @ksahu750)
Corrigido - NPE durante o tempo limite de resposta de confirmação (graças a @BlueSodaWater)
Corrigido – Vazamento de recursos no método readVersion() (graças a @ JHOANG23)
Recurso - disponibilidade adicional para adicionar pares de valores-chave ao armazenamento de soquete durante a autorização (graças a @shutuper)
Recurso - método getRoomOperations() com parâmetro room varargs (graças a @shutuper)
Corrigido - o cliente não consegue se conectar ao namespace não padrão (graças a @lyjnew)
Corrigido – NPE em WebSocketTransport e PollingTransport (graças a @Hunterk95)
JDK 8 é a versão mínima necessária para uso.
Corrigido – mensagem maior que maxFramePayloadLength causa vazamento de memória
Recurso - Suporte ao protocolo SocketIO 4.x (graças a @HashZhang)
Corrigido – adicione todas as classes específicas do socketio aos pacotes (graças a @rishabhgup)
Corrigido - erro io.netty.channel.ChannelPipelineException
Recurso - Método SocketIOClient.isWritable() adicionado (obrigado @ xuwenqing04)
Recurso - método Namespace.addListeners (Iterable listeners) adicionado (obrigado @damonxue)
Corrigido – o pacote de eventos de desconexão deveria ser um subtipo de MESSAGE (obrigado @MasterShi)
Corrigido - BaseStoreFactory lança NPE
Recurso - Adicionado suporte para entrada e saída em massa (obrigado @ksahu750)
Corrigido - desconectado automaticamente (regressão desde 1.7.22)
Recurso - suporte ping/pong para protocolo socketio v4 (graças a @HashZhang)
Corrigido – o nome do transporte deveria ser verificado em letras maiúsculas (regressão desde 1.7.20)
Recurso - configuração needClientAuth adicionada (graças a @huws)
Corrigido - ContinuationWebSocketFrame deveria ser usado se payload > maxFramePayloadLength (graças a 俞伟搏)
Corrigido - a classe src do ouvinte de evento e o bean de destino não correspondem (graças a @cifaz)
Corrigido – parâmetro de transporte ilegal (graças a @mirus36)
Recurso - configurações writeBufferWaterMarkLow e writeBufferWaterMarkHigh adicionadas (graças a @xuminwlt)
Recurso - configuração AllowHeaders adicionada (graças a @HuangHuan)
Recurso - método getCurrentRoomSize() adicionado (graças a @ sunxiaoyu3)
Corrigido - bug de namespace (graças a @@johntyty912)
Corrigido – vários nós com redisson recebem a mesma mensagem (graças a 梁嘉祺)
Corrigido – vários nós recebem apenas uma mensagem LEAVE ao desconectar o cliente (graças a @GaryLeung922)
Recurso - suporte para interceptadores de eventos que capturam todos os eventos (graças a @yosiat)
Corrigido – transmissão de eventos de namespace (graças a Volodymyr Masliy)
Recurso - configuração randomSession adicionada ao objeto Config (graças a @yuanxiangz)
Corrigido - NPE em WebSocketTransport
Corrigido - NPE e vazamento de memória (graças a zhaolianwang)
Corrigido - análise de namespace (graças ao Redliver)
Corrigido - compatibilidade com Redisson 3.9+
Corrigido - manipulação de ACK não thread-safe (graças a @dawnbreaks)
Corrigido – canais de pesquisa longa inativos causam vazamento de memória (graças a @dawnbreaks)
Corrigido - processamento CloseFrame do websocket (graças a @hangsu.cho)
Corrigido - WebSocketTransport NPE
Corrigido – o ID da sessão não é mais exclusivo
Corrigido - conexão subjacente corrigida que não fechava no tempo limite do ping
Corrigido - o problema "fin_close"
Recurso - adicionado endereço de soquete local para a conexão (graças a @SergeyGrigorev)
Recurso - método addPingListener
adicionado (graças a @lovebing)
Recurso - adicione ThreadFactory para HashedWheelTimer (graças a @ hand515)
Corrigido - SO_LINGER alterado para ser tratado como opção de canal filho (não canal do servidor) (graças a @robymus)
Corrigido - Vazamento de ByteBuf se anexos binários forem usados
Corrigido – restaurar sessão do Cookie (graças a @wuxudong)
Corrigido - NumberFormatException quando b64 é um valor bool (graças a @vonway)
Fixo - codificação de dados para transporte de polling
Recurso - Adicionada opção para alterar o SSL KeyFactoryAlgorithm usando Configuração (graças a @robymus)
Melhoria - Melhorias no tratamento de confirmação binária (graças a Sergey Bushik)
Corrigido – Falha ao marcar uma promessa como sucesso porque ela já foi bem-sucedida (graças a @robymus)
Recurso - Método SocketIOServer.removeAllListeners
adicionado
Recurso - Método BroadcastOperations.sendEvent
com parâmetro excludedClient
adicionado
Melhoria – Redisson atualizado para 2.4.0
Corrigido – vazamento de memória no objeto Namespace (graças a @CrazyIvan007)
Corrigido - Erro de lançamento se o transporte não for suportado
Corrigido - Desconexão do cliente ao usar Polling - IndexOutOfBoundsException
Corrigido – netty atualizado para a versão 4.1.0.CR3
Corrigido - análise de pacotes binários (graças a Winston Li)
Recurso - Suporte à compressão
Corrigido – Tratamento de solicitação do cliente DotNET
Corrigido – análise de formato de comprimento de pacote
Corrigido - ignorando 'd=' no pacote
Corrigido – Clientes de polling eram desconectados esporadicamente prematuramente (graças ao lpage30)
Corrigido - as conexões permanecem abertas para sempre se o servidor enviar um pacote close
Corrigido - compatibilidade com a versão mais recente do Redisson
Melhoria – WebSocketServerHandshaker.allowExtensions
é true
agora
Melhoria – implementação do cookie SessionID (graças a @ryandietrich)
Corrigido – vazamento de clientRooms (graças a @andreaspalm)
Corrigido – ExceptionListener não usado para erros na análise JSON
Corrigido – ataque de “canal silencioso”
Melhoria - parâmetro useStrictOrdering
adicionado para ordenação estrita de pacotes websocket
Melhoria - FAIL_ON_EMPTY_BEANS = false
definida no decodificador json
Melhoria - não há necessidade de adicionar jackson lib se você usar o próprio JsonSupport impl
Corrigido – suporte ao cliente SocketIO 1.3.x
Corrigido - Manipulação de codificação Charset (graças a alim-akbashev)
Melhoria - SocketIONamespace.getName()
adicionado
Corrigido – agregação de frames WebSocket
Corrigido – liberação de buffer WebSocket
Corrigido – Unexpected end-of-input in VALUE_STRING
Corrigido - Access-Control-Allow-Credentials é TRUE para solicitações com cabeçalho de origem
Recurso - Parâmetro Configuration.sslProtocol
adicionado
Corrigido - Tratamento de confirmação BinaryEvent
Corrigido - codificação/decodificação BinaryEvent não b64
Corrigido – vazamento de buffer durante a codificação de pacotes
Fixo - codificação de pacotes
Corrigido – codificação/decodificação BinaryEvent
Corrigido - manipulação de conexões incontestadas
Recurso - configuração origin
adicionada
Recurso - configuração crossDomainPolicy
adicionada
Recurso - Método SocketIOServer.startAsync
adicionado
Recurso - Suporte Epoll
Melhoria – suporte a BinaryEvent
Corrigido - Tratamento de desconexão do SocketIOClient
Corrigido – retorno de chamada de transmissão
Fixo - NPE, então nenhum transporte definido durante a autenticação
Corrigido - tempo limite de ping para transporte de polling
Corrigido – vazamento de buffer no PacketEncoder
Corrigido – codificação incorreta de mensagens de saída usando transporte websocket
Fixo - NPE no transporte de websocket
Corrigido – decodificação de múltiplos pacotes no transporte de polling
Corrigido – vazamento de buffer
Recurso - capacidade de definir Access-Control-Allow-Origin
personalizado via Configuration.origin
Corrigido - conexão via CLI socket.io-client
Recurso - Suporte ao protocolo Socket.IO 1.0. Graças ao novo protocolo, a decodificação/codificação foi acelerada
Eliminados - métodos SocketIOClient.sendMessage
, SocketIOClient.sendJsonObject
e ouvintes correspondentes
Descartado - Suporte de transporte Flashsocket
Eliminado - versão do protocolo 0.7 ... 0.9.16
Melhoria – codificação de pacote único otimizada, usada principalmente em transporte WebSocket. Tempo de codificação reduzido em até 40% (graças a Viktor Endersz)
Melhoria – manuseio de salas otimizado
Melhoria - método ExceptionListener.exceptionCaught adicionado
Quebrando a alteração da API - Configuration.autoAck substituído por ackMode
Recurso - configuração trustStore adicionada
Recurso - configuração maxFramePayloadLength adicionada
Recurso - métodos getAllClients e getClient adicionados ao SocketIONamespace
Corrigido - SocketIOServer.getAllClients retorna quantidade de clientes errada
Corrigido – problema de liberação de mensagem
Corrigido – problema com a redefinição da configuração do listener de exceção
Quebrando a alteração da API - DataListener.onData agora lança exceção
Melhoria – parâmetro de dados adicionado ao ouvinte de exceção
Melhoria - capacidade de configurar a configuração do soquete
Melhoria - parâmetro Configuration.autoAck adicionado
Corrigido - Tratamento de AckCallback durante desconexão do cliente
Corrigido – código HTTP de handshake não autorizado alterado para 401
Alteração significativa da API - configuração Configuration.heartbeatThreadPoolSize removida
Recurso - suporte anotado a beans Spring via SpringAnnotationScanner
Recurso - ouvinte de exceção comum
Melhoria – ScheduledExecutorService substituído por HashedWheelTimer
Corrigido – tratamento incorreto de desconexão do cliente de namespace
Corrigido - exceção nos métodos onConnect/onDisconnect/isAuthorized leva ao travamento do servidor
Quebrando a alteração da API - assinatura dos métodos SocketIOClient.sendEvent alterada
Melhoria - suporte a eventos de vários tipos via MultiTypeEventListener e anotação OnEvent
Melhoria - suporte para confirmação de eventos de vários tipos via MultiTypeAckCallback
Melhoria - método SocketIOClient.getHandshakeData adicionado
Melhoria – Jedis substituídos por Redisson
Corrigido – compatibilidade com JDK 1.6+
Recurso - suporte para autorização
Corrigido – regressão de transporte de pooling XHR
Corrigido – regressão de transporte Websocket
Corrigido - namespace NPE no PacketHandler
Corrigido - desligamento dos executores durante a parada do servidor
Recurso - suporte à loja do cliente (Memory, Redis, Hazelcast)
Recurso - suporte para transmissão distribuída entre nós netty-socketio (Redis, Hazelcast)
Recurso - suporte OSGi (graças a rdevera)
Melhoria – Otimização do pooling XHR
Melhoria - método SocketIOClient.getAllRooms adicionado
Corrigido – política de flash “solicitação de vazamento” após recarregamento da página (graças ao ntrp)
Corrigido - carregamento de websocket swf (graças ao ntrp)
Corrigido – URLs errados causam um potencial DDoS
Corrigido – a visibilidade do pacote Event.class foi alterada para evitar o uso direto
Melhoria - Cadastro simplificado de módulos Jackson
Corrigido - NPE durante o desligamento
Melhoria – método isEmpty adicionado ao Namespace
Corrigido - invocação de retorno de chamada de tempo limite de confirmação incorreta
Corrigido – serialização bigdecimal para JSON
Corrigido - loop infinito durante exceção de manipulação de pacotes
Corrigido - tratamento de 'cliente não encontrado'
Melhoria - otimização da alocação de buffers de codificação.
Melhoria – buffers de codificação agora agrupados na memória para reduzir a pressão do GC (recurso netty 4.x).
Corrigido – erro em propriedade desconhecida durante a desserialização.
Corrigido – vazamento de memória em transporte de polling longo.
Melhoria – registro de informações de erro com dados de entrada.
Primeira versão estável.