protected void dispatch( Message m )
    {
        if( log.isLoggable(Level.FINER) ) {
            log.log(Level.FINER, "{0} received:{1}", new Object[]{this, m});
        }
        
        // Pull off the connection management messages we're
        // interested in and then pass on the rest.
        if( m instanceof ClientRegistrationMessage ) {
            ClientRegistrationMessage crm = (ClientRegistrationMessage)m; 
            // See if it has a real ID
            if( crm.getId() >= 0 ) {
                // Then we've gotten our real id
                this.id = (int)crm.getId();
                log.log( Level.FINE, "Connection established, id:{0}.", this.id );
                connecting.countDown();
                //fireConnected();
            } else {
                // Else it's a message letting us know that the 
                // hosted services have been started
                startServices();
 
                // Delay firing 'connected' until the services have all
                // been started to avoid odd race conditions.  If there is some
                // need to get some kind of event before the services have been
                // started then we should create a new event step.               
                fireConnected();
            }
            return;
        } else if( m instanceof ChannelInfoMessage ) {
            // This is an interim step in the connection process, and
            // now we need to add a bunch of connections.
            configureChannels( ((ChannelInfoMessage)m).getId(), ((ChannelInfoMessage)m).getPorts() );
            return; 
        } else if( m instanceof DisconnectMessage ) {
            // Can't do too much else yet
            String reason = ((DisconnectMessage)m).getReason();
            log.log( Level.SEVERE, "Connection terminated, reason:{0}.", reason );
            DisconnectInfo info = new DisconnectInfo();
            info.reason = reason;
            closeConnections(info);
        }
    
        // Make sure client MessageListeners are called single-threaded
        // since it could receive messages from the TCP and UDP
        // thread simultaneously.
        synchronized( this ) {
            messageListeners.messageReceived( this, m );
        }
    }
Either calls the ErrorListener or closes the connection
 if there are no listeners.
jme3-networking/src/main/java/com/jme3/network/base/DefaultClient.java