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();
}
}