diff --git a/README.md b/README.md index b6db3a9..8174e18 100644 --- a/README.md +++ b/README.md @@ -56,4 +56,219 @@ Fixed - unauthorized handshake HTTP code changed to 401 __Breaking api change__ - Configuration.heartbeatThreadPoolSize setting removed Feature - annotated Spring beans support via _SpringAnnotationScanner_ Feature - common exception listener -Improvement - _ScheduledExecutorService_ replaced with _HashedWheelT +Improvement - _ScheduledExecutorService_ replaced with _HashedWheelTimer_ + +####08-Feb-2014 - version 1.6.2 released (JDK 1.6+ compatible, Netty 4.0.15) +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](https://github.com/mrniko/redisson) + +####14-Jan-2014 - version 1.6.1 released (JDK 1.6+ compatible, Netty 4.0.14) +Fixed - JDK 1.6+ compatibility +Feature - authorization support + +####19-Dec-2013 - version 1.6.0 released (JDK 1.6+ compatible, Netty 4.0.13) +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](http://redis.io/), [Hazelcast](http://www.hazelcast.com/)) support +Feature - distributed broadcast across netty-socketio nodes ([Redis](http://redis.io/), [Hazelcast](http://www.hazelcast.com/)) support +Feature - OSGi support (thanks to rdevera) +Improvement - XHR-pooling optimization +Improvement - SocketIOClient.getAllRooms method added + +####07-Dec-2013 - version 1.5.4 released (JDK 1.6+ compatible, Netty 4.0.13) +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 + +####24-Oct-2013 - version 1.5.2 released (JDK 1.6+ compatible, Netty 4.0.11) +Fixed - NPE during shutdown +Improvement - isEmpty method added to Namespace + +####13-Oct-2013 - version 1.5.1 released (JDK 1.6+ compatible, Netty 4.0.9) +Fixed - wrong ack timeout callback invocation +Fixed - bigdecimal serialization for JSON +Fixed - infinity loop during packet handling exception +Fixed - 'client not found' handling + +####27-Aug-2013 - version 1.5.0 released (JDK 1.6+ compatible, Netty 4.0.7) +Improvement - encoding buffers allocation optimization. +Improvement - encoding buffers now pooled in memory to reduce GC pressure (netty 4.x feature). + +####03-Aug-2013 - version 1.0.1 released (JDK 1.5+ compatible) +Fixed - error on unknown property during deserialization. +Fixed - memory leak in long polling transport. +Improvement - logging error info with inbound data. + +####07-Jun-2013 - version 1.0.0 released (JDK 1.5+ compatible) +First stable release. + + +### Maven + +Include the following to your dependency list: + + + com.corundumstudio.socketio + netty-socketio + 1.6.3 + + + +Usage example +================================ +##Server + +Base configuration. More details about Configuration object is [here](https://github.com/mrniko/netty-socketio/wiki/Configuration-details). + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(81); + + SocketIOServer server = new SocketIOServer(config); + +Programmatic handlers binding: + + server.addMessageListener(new DataListener() { + @Override + public void onData(SocketIOClient client, String message, AckRequest ackRequest) { + ... + } + }); + + server.addEventListener("someevent", SomeClass.class, new DataListener() { + @Override + public void onData(SocketIOClient client, Object data, AckRequest ackRequest) { + ... + } + }); + + server.addConnectListener(new ConnectListener() { + @Override + public void onConnect(SocketIOClient client) { + ... + } + }); + + server.addDisconnectListener(new DisconnectListener() { + @Override + public void onDisconnect(SocketIOClient client) { + ... + } + }); + + + // Don't forget to include type field on javascript side, + // it named '@class' by default and should equals to full class name. + // + // TIP: you can customize type field name via Configuration.jsonTypeFieldName property. + + server.addJsonObjectListener(SomeClass.class, new DataListener() { + @Override + public void onData(SocketIOClient client, SomeClass data, AckRequest ackRequest) { + + ... + + // send object to socket.io client + SampleObject obj = new SampleObject(); + client.sendJsonObject(obj); + } + }); + +Declarative handlers binding. Handlers could be bound via annotations on any object: + + pubic class SomeBusinessService { + + ... + // some stuff code + ... + + // SocketIOClient, AckRequest and Data could be ommited + @OnEvent('someevent') + public void onSomeEventHandler(SocketIOClient client, SomeClass data, AckRequest ackRequest) { + ... + } + + @OnConnect + public void onConnectHandler(SocketIOClient client) { + ... + } + + @OnDisconnect + public void onDisconnectHandler(SocketIOClient client) { + ... + } + + // only data object is required in arguments, + // SocketIOClient and AckRequest could be ommited + @OnJsonObject + public void onSomeEventHandler(SocketIOClient client, SomeClass data, AckRequest ackRequest) { + ... + } + + // only data object is required in arguments, + // SocketIOClient and AckRequest could be ommited + @OnMessage + public void onSomeEventHandler(SocketIOClient client, String data, AckRequest ackRequest) { + ... + } + + } + + SomeBusinessService someService = new SomeBusinessService(); + server.addListeners(someService); + + + server.start(); + + ... + + server.stop(); + +##Client + + + +