diff --git a/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java b/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java index 2d813bef4..242f37bb2 100644 --- a/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java +++ b/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java @@ -120,9 +120,12 @@ public class ConnectorAdapter extends Thread // Kill the writer service writer.shutdown(); - - // Kill the connector - connector.close(); + + if( connector.isConnected() ) + { + // Kill the connector + connector.close(); + } } protected void dispatch( Message m ) diff --git a/engine/src/networking/com/jme3/network/base/DefaultServer.java b/engine/src/networking/com/jme3/network/base/DefaultServer.java index 8b8ed34c6..024563178 100644 --- a/engine/src/networking/com/jme3/network/base/DefaultServer.java +++ b/engine/src/networking/com/jme3/network/base/DefaultServer.java @@ -398,7 +398,11 @@ public class DefaultServer implements Server protected void connectionClosed( Endpoint p ) { - log.log( Level.INFO, "Connection closed:{0}.", p ); + if( p.isConnected() ) { + log.log( Level.INFO, "Connection closed:{0}.", p ); + } else { + log.log( Level.FINE, "Connection closed:{0}.", p ); + } // Try to find the endpoint in all ways that it might // exist. Note: by this point the raw network channel is @@ -424,7 +428,9 @@ public class DefaultServer implements Server // Better not to fire events while we hold a lock // so always do this outside the synch block. - if( removed != null ) { + // Note: checking removed.closed just to avoid spurious log messages + // since in general we are called back for every endpoint closing. + if( removed != null && !removed.closed ) { log.log( Level.INFO, "Client closed:{0}.", removed ); diff --git a/engine/src/networking/com/jme3/network/base/KernelAdapter.java b/engine/src/networking/com/jme3/network/base/KernelAdapter.java index f2bf6a13b..0c47056d7 100644 --- a/engine/src/networking/com/jme3/network/base/KernelAdapter.java +++ b/engine/src/networking/com/jme3/network/base/KernelAdapter.java @@ -135,6 +135,8 @@ public class KernelAdapter extends Thread // Remove any message buffer we've been accumulating // on behalf of this endpoing messageBuffers.remove(p); + + log.log( Level.FINE, "Buffers size:{0}", messageBuffers.size() ); server.connectionClosed(p); } diff --git a/engine/src/networking/com/jme3/network/kernel/tcp/NioEndpoint.java b/engine/src/networking/com/jme3/network/kernel/tcp/NioEndpoint.java index 8b8056d7a..367eb019b 100644 --- a/engine/src/networking/com/jme3/network/kernel/tcp/NioEndpoint.java +++ b/engine/src/networking/com/jme3/network/kernel/tcp/NioEndpoint.java @@ -89,6 +89,9 @@ public class NioEndpoint implements Endpoint } try { + // Note: even though we may be disconnected from the socket.isConnected() + // standpoint, it's still safest to tell the kernel so that it can be sure + // to stop managing us gracefully. kernel.closeEndpoint(this); } catch( IOException e ) { throw new KernelException( "Error closing endpoint for socket:" + socket, e ); diff --git a/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java b/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java index 00060215f..0a64e2a7e 100644 --- a/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java +++ b/engine/src/networking/com/jme3/network/kernel/tcp/SelectorKernel.java @@ -160,6 +160,7 @@ public class SelectorKernel extends AbstractKernel protected void removeEndpoint( NioEndpoint p, SocketChannel c ) { endpoints.remove( p.getId() ); + log.log( Level.FINE, "Endpoints size:{0}", endpoints.size() ); // Enqueue an endpoint event for the listeners addEvent( EndpointEvent.createRemove( this, p ) ); @@ -180,7 +181,7 @@ public class SelectorKernel extends AbstractKernel */ protected void closeEndpoint( NioEndpoint p ) throws IOException { - log.log( Level.INFO, "Closing endpoint:{0}.", p ); + //log.log( Level.INFO, "Closing endpoint:{0}.", p ); thread.cancel(p); } @@ -322,13 +323,14 @@ public class SelectorKernel extends AbstractKernel protected void cancel( NioEndpoint p ) throws IOException { - log.log( Level.INFO, "Closing endpoint:{0}.", p ); SelectionKey key = endpointKeys.remove(p); if( key == null ) { - log.log( Level.INFO, "Endpoint already closed:{0}.", p ); + //log.log( Level.INFO, "Endpoint already closed:{0}.", p ); return; // already closed it } + log.log( Level.FINE, "Endpoint keys size:{0}", endpointKeys.size() ); + log.log( Level.INFO, "Closing endpoint:{0}.", p ); SocketChannel c = (SocketChannel)key.channel(); // Note: key.cancel() is specifically thread safe. One of @@ -341,9 +343,11 @@ public class SelectorKernel extends AbstractKernel protected void cancel( SelectionKey key, SocketChannel c ) throws IOException { - NioEndpoint p = (NioEndpoint)key.attachment(); + NioEndpoint p = (NioEndpoint)key.attachment(); log.log( Level.INFO, "Closing channel endpoint:{0}.", p ); - endpointKeys.remove(p); + Object o = endpointKeys.remove(p); + + log.log( Level.FINE, "Endpoint keys size:{0}", endpointKeys.size() ); key.cancel(); c.close(); diff --git a/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java b/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java index d380b3746..51a953f36 100644 --- a/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java +++ b/engine/src/networking/com/jme3/network/kernel/udp/UdpKernel.java @@ -162,10 +162,12 @@ public class UdpKernel extends AbstractKernel */ protected void closeEndpoint( UdpEndpoint p ) throws IOException { - log.log( Level.INFO, "Closing endpoint:{0}.", p ); - // Just book-keeping to do here. - socketEndpoints.remove( p.getRemoteAddress() ); + if( socketEndpoints.remove( p.getRemoteAddress() ) == null ) + return; + + log.log( Level.INFO, "Closing endpoint:{0}.", p ); + log.log( Level.FINE, "Socket endpoints size:{0}", socketEndpoints.size() ); addEvent( EndpointEvent.createRemove( this, p ) );