diff --git a/.gitignore b/.gitignore index d7e41aae5..f7c5794dd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,6 @@ target .classpath bin -/doc \ No newline at end of file +/doc +/dist/ +/gradle/ diff --git a/dist/java_websocket.jar b/dist/java_websocket.jar deleted file mode 100644 index bb5caeb4e..000000000 Binary files a/dist/java_websocket.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 0087cd3b1..000000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7dfc31e8e..000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Jul 02 20:43:27 CEST 2014 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-1.4-bin.zip diff --git a/pom.xml b/pom.xml index 0316b921c..a962ac63f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ UTF-8 1.6 - 1.0.0.RC24 + 1.0.2 @@ -74,7 +74,7 @@ info.cukes cucumber-junit - 1.0.0 + 1.0.2 test diff --git a/src/main/java/org/java_websocket/SSLSocketChannel2.java b/src/main/java/org/java_websocket/SSLSocketChannel2.java index e540612bb..404e2c016 100644 --- a/src/main/java/org/java_websocket/SSLSocketChannel2.java +++ b/src/main/java/org/java_websocket/SSLSocketChannel2.java @@ -308,7 +308,6 @@ public void close() throws IOException { if( socketChannel.isOpen() ) socketChannel.write( wrap( emptybuffer ) );// FIXME what if not all bytes can be written socketChannel.close(); - exec.shutdownNow(); } private boolean isHandShakeComplete() { diff --git a/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java b/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java index b871260f8..32896f9a0 100644 --- a/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java +++ b/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java @@ -48,4 +48,8 @@ public WebSocketImpl createWebSocket( WebSocketAdapter a, Draft d, Socket c ) { public WebSocketImpl createWebSocket( WebSocketAdapter a, List d, Socket s ) { return new WebSocketImpl( a, d ); } + @Override + public void close() { + exec.shutdown(); + } } \ No newline at end of file diff --git a/src/main/java/org/java_websocket/server/DefaultWebSocketServerFactory.java b/src/main/java/org/java_websocket/server/DefaultWebSocketServerFactory.java index 3b89cdc2f..59d0e3963 100644 --- a/src/main/java/org/java_websocket/server/DefaultWebSocketServerFactory.java +++ b/src/main/java/org/java_websocket/server/DefaultWebSocketServerFactory.java @@ -23,4 +23,7 @@ public WebSocketImpl createWebSocket( WebSocketAdapter a, List d, Socket public SocketChannel wrapChannel( SocketChannel channel, SelectionKey key ) { return (SocketChannel) channel; } + @Override + public void close() { + } } \ No newline at end of file diff --git a/src/main/java/org/java_websocket/server/WebSocketServer.java b/src/main/java/org/java_websocket/server/WebSocketServer.java index 12cea2f1d..b8684f542 100644 --- a/src/main/java/org/java_websocket/server/WebSocketServer.java +++ b/src/main/java/org/java_websocket/server/WebSocketServer.java @@ -215,6 +215,8 @@ public void stop( int timeout ) throws InterruptedException { ws.close( CloseFrame.GOING_AWAY ); } + wsf.close(); + synchronized ( this ) { if( selectorthread != null && selectorthread != Thread.currentThread() ) { selector.wakeup(); @@ -292,8 +294,9 @@ public void run() { Iterator i = keys.iterator(); while ( i.hasNext() ) { + conn = null; //Make sure to reset the connection on each iteration to avoid state bugs. key = i.next(); - + if( !key.isValid() ) { // Object o = key.attachment(); continue; @@ -306,18 +309,34 @@ public void run() { } SocketChannel channel = server.accept(); + if(channel==null){ + continue; + } channel.configureBlocking( false ); WebSocketImpl w = wsf.createWebSocket( this, drafts, channel.socket() ); w.key = channel.register( selector, SelectionKey.OP_READ, w ); - w.channel = wsf.wrapChannel( channel, w.key ); - i.remove(); - allocateBuffers( w ); + try { + w.channel = wsf.wrapChannel( channel, w.key ); + i.remove(); + allocateBuffers( w ); + continue; + } catch (IOException ex) { + if (w.key != null) + w.key.cancel(); + } continue; } if( key.isReadable() ) { conn = (WebSocketImpl) key.attachment(); ByteBuffer buf = takeBuffer(); + if(conn.channel == null){ + if( key != null ) + key.cancel(); + + handleIOException( key, conn, new IOException() ); + continue; + } try { if( SocketChannelIOHelper.read( buf, conn, conn.channel ) ) { if( buf.hasRemaining() ) { @@ -729,5 +748,7 @@ public interface WebSocketServerFactory extends WebSocketFactory { * @return The channel on which the read and write operations will be performed.
*/ public ByteChannel wrapChannel( SocketChannel channel, SelectionKey key ) throws IOException; + + public void close(); } }