Parcourir la source

Integrated the new service manager stuff with Client and
Server. (Untested at the moment but straight forward.)
Also fixed a small but silent bug in DefaultServer when
closing out endpoints that were never fully connected.
Garbage was left around in the "connecting" data structure.

Paul Speed il y a 10 ans
Parent
commit
35155c6b5b

+ 6 - 0
jme3-networking/src/main/java/com/jme3/network/Client.java

@@ -72,6 +72,12 @@ public interface Client extends MessageConnection
      *  be able to connect to.
      */   
     public int getVersion();
+
+    /**
+     *  Returns the manager for client services.  Client services extend
+     *  the functionality of the client.
+     */
+    public ClientServiceManager getServices();     
  
     /**
      *  Sends a message to the server.

+ 8 - 0
jme3-networking/src/main/java/com/jme3/network/Server.java

@@ -33,6 +33,8 @@ package com.jme3.network;
 
 import java.util.Collection;
 
+import com.jme3.network.service.HostedServiceManager;
+
 /**
  *  Represents a host that can send and receive messages to
  *  a set of remote client connections.
@@ -54,6 +56,12 @@ public interface Server
      */   
     public int getVersion();
 
+    /**
+     *  Returns the manager for hosted services.  Hosted services extend
+     *  the functionality of the server.
+     */
+    public HostedServiceManager getServices();     
+
     /**
      *  Sends the specified message to all connected clients.
      */ 

+ 21 - 2
jme3-networking/src/main/java/com/jme3/network/base/DefaultClient.java

@@ -37,6 +37,7 @@ import com.jme3.network.kernel.Connector;
 import com.jme3.network.message.ChannelInfoMessage;
 import com.jme3.network.message.ClientRegistrationMessage;
 import com.jme3.network.message.DisconnectMessage;
+import com.jme3.network.service.ClientServiceManager;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -54,7 +55,7 @@ import java.util.logging.Logger;
  */
 public class DefaultClient implements Client
 {
-    static Logger log = Logger.getLogger(DefaultClient.class.getName());
+    static final Logger log = Logger.getLogger(DefaultClient.class.getName());
     
     // First two channels are reserved for reliable and
     // unreliable.  Note: channels are endpoint specific so these
@@ -80,10 +81,13 @@ public class DefaultClient implements Client
  
     private ConnectorFactory connectorFactory;
     
+    private ClientServiceManager services;
+    
     public DefaultClient( String gameName, int version )
     {
         this.gameName = gameName;
         this.version = version;
+        this.services = new ClientServiceManager(this);
     }
     
     public DefaultClient( String gameName, int version, Connector reliable, Connector fast,
@@ -200,6 +204,11 @@ public class DefaultClient implements Client
     {
         return version;
     }
+    
+    public ClientServiceManager getServices() 
+    {
+        return services;
+    }
    
     public void send( Message message )
     {
@@ -260,7 +269,7 @@ public class DefaultClient implements Client
     {
         checkRunning();
  
-        closeConnections( null );            
+        closeConnections( null );
     }         
 
     protected void closeConnections( DisconnectInfo info )
@@ -268,6 +277,10 @@ public class DefaultClient implements Client
         if( !isRunning )
             return;
 
+        // Let the services get a chance to stop before we
+        // kill the connection.
+        services.stop();
+        
         // Send a close message
     
         // Tell the thread it's ok to die
@@ -285,6 +298,9 @@ public class DefaultClient implements Client
         fireDisconnected(info);
         
         isRunning = false;
+        
+        // Terminate the services
+        services.terminate();            
     }         
 
     public void addClientStateListener( ClientStateListener listener )
@@ -329,6 +345,9 @@ public class DefaultClient implements Client
  
     protected void fireConnected()
     {
+        // Let the services know we are finally started
+        services.start();
+    
         for( ClientStateListener l : stateListeners ) {
             l.clientConnected( this );
         }            

+ 47 - 5
jme3-networking/src/main/java/com/jme3/network/base/DefaultServer.java

@@ -37,6 +37,7 @@ import com.jme3.network.kernel.Kernel;
 import com.jme3.network.message.ChannelInfoMessage;
 import com.jme3.network.message.ClientRegistrationMessage;
 import com.jme3.network.message.DisconnectMessage;
+import com.jme3.network.service.HostedServiceManager;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -55,7 +56,7 @@ import java.util.logging.Logger;
  */
 public class DefaultServer implements Server
 {
-    static Logger log = Logger.getLogger(DefaultServer.class.getName());
+    static final Logger log = Logger.getLogger(DefaultServer.class.getName());
 
     // First two channels are reserved for reliable and
     // unreliable
@@ -85,6 +86,8 @@ public class DefaultServer implements Server
                             = new MessageListenerRegistry<HostedConnection>();                        
     private List<ConnectionListener> connectionListeners = new CopyOnWriteArrayList<ConnectionListener>();
     
+    private HostedServiceManager services;
+    
     public DefaultServer( String gameName, int version, Kernel reliable, Kernel fast )
     {
         if( reliable == null )
@@ -92,6 +95,7 @@ public class DefaultServer implements Server
             
         this.gameName = gameName;
         this.version = version;
+        this.services = new HostedServiceManager(this);
         
         reliableAdapter = new KernelAdapter( this, reliable, dispatcher, true );
         channels.add( reliableAdapter );
@@ -110,6 +114,11 @@ public class DefaultServer implements Server
     {
         return version;
     }
+    
+    public HostedServiceManager getServices() 
+    {
+        return services;
+    }
 
     public int addChannel( int port )
     {
@@ -164,7 +173,10 @@ public class DefaultServer implements Server
             ka.start();
         }
         
-        isRunning = true;             
+        isRunning = true;
+        
+        // Start the services
+        services.start();             
     }
 
     public boolean isRunning()
@@ -177,13 +189,20 @@ public class DefaultServer implements Server
         if( !isRunning )
             throw new IllegalStateException( "Server is not started." );
  
+        // First stop the services since we are about to
+        // kill the connections they are using
+        services.stop();
+ 
         try {
             // Kill the adpaters, they will kill the kernels
             for( KernelAdapter ka : channels ) {
                 ka.close();
             }
             
-            isRunning = false;            
+            isRunning = false;
+            
+            // Now terminate all of the services
+            services.terminate();             
         } catch( InterruptedException e ) {
             throw new RuntimeException( "Interrupted while closing", e );
         }                               
@@ -396,6 +415,18 @@ public class DefaultServer implements Server
         return endpointConnections.get(endpoint);       
     } 
 
+    protected void removeConnecting( Endpoint p ) 
+    {
+        // No easy lookup for connecting Connections
+        // from endpoint.
+        for( Map.Entry<Long,Connection> e : connecting.entrySet() ) {
+            if( e.getValue().hasEndpoint(p) ) {
+                connecting.remove(e.getKey());
+                return;
+            } 
+        }
+    }
+
     protected void connectionClosed( Endpoint p )
     {
         if( p.isConnected() ) {
@@ -411,10 +442,10 @@ public class DefaultServer implements Server
         // Also note: this method will be called multiple times per
         // HostedConnection if it has multiple endpoints.
  
-        Connection removed = null;
+        Connection removed;
         synchronized( this ) {             
             // Just in case the endpoint was still connecting
-            connecting.values().remove(p);
+            removeConnecting(p);
 
             // And the regular management
             removed = (Connection)endpointConnections.remove(p);
@@ -452,6 +483,16 @@ public class DefaultServer implements Server
             id = nextId.getAndIncrement();
             channels = new Endpoint[channelCount];
         }
+        
+        boolean hasEndpoint( Endpoint p )
+        {
+            for( Endpoint e : channels ) {
+                if( p == e ) {
+                    return true;
+                }
+            }
+            return false;
+        }
  
         void setChannel( int channel, Endpoint p )
         {
@@ -557,6 +598,7 @@ public class DefaultServer implements Server
             return Collections.unmodifiableSet(sessionData.keySet());
         }           
         
+        @Override
         public String toString()
         {
             return "Connection[ id=" + id + ", reliable=" + channels[CH_RELIABLE] 

+ 1 - 1
jme3-networking/src/main/java/com/jme3/network/service/Service.java

@@ -53,7 +53,7 @@ public interface Service<S> {
     public void start();
     
     /**
-     *  Called when the service is shutting down.  All services
+     *  Called when the service manager is shutting down.  All services
      *  are stopped and any service manager resources are closed
      *  before the services are terminated.
      */