diff --git a/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java b/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java index 3d9f9c48d..f66335c76 100644 --- a/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java +++ b/engine/src/networking/com/jme3/network/base/ConnectorAdapter.java @@ -39,6 +39,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import com.jme3.network.Message; import com.jme3.network.MessageListener; import com.jme3.network.kernel.Connector; +import com.jme3.network.kernel.ConnectorException; import com.jme3.network.serializing.Serializer; /** @@ -90,6 +91,15 @@ public class ConnectorAdapter extends Thread while( go.get() ) { ByteBuffer buffer = connector.read(); + if( buffer == null ) { + if( go.get() ) { + throw new ConnectorException( "Connector closed." ); + } else { + // Just dump out because a null buffer is expected + // from a closed/closing connector + break; + } + } protocol.addBuffer( buffer ); diff --git a/engine/src/networking/com/jme3/network/kernel/tcp/SocketConnector.java b/engine/src/networking/com/jme3/network/kernel/tcp/SocketConnector.java index 32db6a7c8..36e69f2e3 100644 --- a/engine/src/networking/com/jme3/network/kernel/tcp/SocketConnector.java +++ b/engine/src/networking/com/jme3/network/kernel/tcp/SocketConnector.java @@ -35,6 +35,7 @@ package com.jme3.network.kernel.tcp; import java.io.*; import java.net.*; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; import com.jme3.network.kernel.*; @@ -54,6 +55,7 @@ public class SocketConnector implements Connector private OutputStream out; private SocketAddress remoteAddress; private byte[] buffer = new byte[65535]; + private AtomicBoolean connected = new AtomicBoolean(false); public SocketConnector( InetAddress address, int port ) throws IOException { @@ -66,6 +68,8 @@ public class SocketConnector implements Connector in = sock.getInputStream(); out = sock.getOutputStream(); + + connected.set(true); } protected void checkClosed() @@ -87,6 +91,7 @@ public class SocketConnector implements Connector try { Socket temp = sock; sock = null; + connected.set(false); temp.close(); } catch( IOException e ) { throw new ConnectorException( "Error closing socket for:" + remoteAddress, e ); @@ -111,14 +116,18 @@ public class SocketConnector implements Connector // Read what we can int count = in.read(buffer); if( count < 0 ) { - // Socket it closed + // Socket is closed close(); return null; } // Wrap it in a ByteBuffer for the caller return ByteBuffer.wrap( buffer, 0, count ); - } catch( IOException e ) { + } catch( IOException e ) { + if( !connected.get() ) { + // Nothing to see here... just move along + return null; + } throw new ConnectorException( "Error reading from connection to:" + remoteAddress, e ); } } diff --git a/engine/src/networking/com/jme3/network/kernel/udp/UdpConnector.java b/engine/src/networking/com/jme3/network/kernel/udp/UdpConnector.java index fdc53f134..97a2e5eb6 100644 --- a/engine/src/networking/com/jme3/network/kernel/udp/UdpConnector.java +++ b/engine/src/networking/com/jme3/network/kernel/udp/UdpConnector.java @@ -35,6 +35,7 @@ package com.jme3.network.kernel.udp; import java.io.*; import java.net.*; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; import com.jme3.network.kernel.*; @@ -51,6 +52,7 @@ public class UdpConnector implements Connector private DatagramSocket sock = new DatagramSocket(); private SocketAddress remoteAddress; private byte[] buffer = new byte[65535]; + private AtomicBoolean connected = new AtomicBoolean(false); /** * In order to provide proper available() checking, we @@ -70,6 +72,8 @@ public class UdpConnector implements Connector // Setup to receive only from the remote address sock.connect( remoteAddress ); + + connected.set(true); } protected void checkClosed() @@ -89,7 +93,8 @@ public class UdpConnector implements Connector { checkClosed(); DatagramSocket temp = sock; - sock = null; + sock = null; + connected.set(false); temp.close(); } @@ -116,7 +121,11 @@ public class UdpConnector implements Connector // Wrap it in a ByteBuffer for the caller return ByteBuffer.wrap( buffer, 0, packet.getLength() ); - } catch( IOException e ) { + } catch( IOException e ) { + if( !connected.get() ) { + // Nothing to see here... just move along + return null; + } throw new ConnectorException( "Error reading from connection to:" + remoteAddress, e ); } }