Search in sources :

Example 1 with ChannelInfoMessage

use of com.jme3.network.message.ChannelInfoMessage in project jmonkeyengine by jMonkeyEngine.

the class DefaultClient method dispatch.

protected void dispatch(Message m) {
    if (log.isLoggable(Level.FINER)) {
        log.log(Level.FINER, "{0} received:{1}", new Object[] { this, m });
    }
    // 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 interum 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);
    }
    // thread simultaneously.
    synchronized (this) {
        messageListeners.messageReceived(this, m);
    }
}
Also used : DisconnectMessage(com.jme3.network.message.DisconnectMessage) ChannelInfoMessage(com.jme3.network.message.ChannelInfoMessage) DisconnectInfo(com.jme3.network.ClientStateListener.DisconnectInfo) ClientRegistrationMessage(com.jme3.network.message.ClientRegistrationMessage)

Example 2 with ChannelInfoMessage

use of com.jme3.network.message.ChannelInfoMessage in project jmonkeyengine by jMonkeyEngine.

the class DefaultServer method registerClient.

protected void registerClient(KernelAdapter ka, Endpoint p, ClientRegistrationMessage m) {
    Connection addedConnection = null;
    // important enough I won't take chances
    synchronized (this) {
        // Grab the random ID that the client created when creating
        // its two registration messages
        long tempId = m.getId();
        // See if we already have one
        Connection c = connecting.remove(tempId);
        if (c == null) {
            c = new Connection(channels.size());
            log.log(Level.FINE, "Registering client for endpoint, pass 1:{0}.", p);
        } else {
            log.log(Level.FINE, "Refining client registration for endpoint:{0}.", p);
        }
        // Fill in what we now know
        int channel = getChannel(ka);
        c.setChannel(channel, p);
        log.log(Level.FINE, "Setting up channel:{0}", channel);
        // and we will send the connection information
        if (channel == CH_RELIABLE) {
            // over the reliable connection at this point.
            if (!getGameName().equals(m.getGameName()) || getVersion() != m.getVersion()) {
                log.log(Level.FINE, "Kicking client due to name/version mismatch:{0}.", c);
                // Need to kick them off... I may regret doing this from within
                // the sync block but the alternative is more code
                c.close("Server client mismatch, server:" + getGameName() + " v" + getVersion() + "  client:" + m.getGameName() + " v" + m.getVersion());
                return;
            }
            // Else send the extra channel information to the client
            if (!alternatePorts.isEmpty()) {
                ChannelInfoMessage cim = new ChannelInfoMessage(m.getId(), alternatePorts);
                c.send(cim);
            }
        }
        if (c.isComplete()) {
            // Then we are fully connected
            if (connections.put(c.getId(), c) == null) {
                for (Endpoint cp : c.channels) {
                    if (cp == null)
                        continue;
                    endpointConnections.put(cp, c);
                }
                addedConnection = c;
            }
        } else {
            // Need to keep getting channels so we'll keep it in
            // the map
            connecting.put(tempId, c);
        }
    }
    // over synchronizing which is the path to deadlocks
    if (addedConnection != null) {
        log.log(Level.FINE, "Client registered:{0}.", addedConnection);
        // Send the ID back to the client letting it know it's
        // fully connected.
        m = new ClientRegistrationMessage();
        m.setId(addedConnection.getId());
        m.setReliable(true);
        addedConnection.send(m);
        // Now we can notify the listeners about the
        // new connection.
        fireConnectionAdded(addedConnection);
        // Send a second registration message with an invalid ID
        // to let the connection know that it can start its services
        m = new ClientRegistrationMessage();
        m.setId(-1);
        m.setReliable(true);
        addedConnection.send(m);
    }
}
Also used : Endpoint(com.jme3.network.kernel.Endpoint) ChannelInfoMessage(com.jme3.network.message.ChannelInfoMessage) Endpoint(com.jme3.network.kernel.Endpoint) ClientRegistrationMessage(com.jme3.network.message.ClientRegistrationMessage)

Aggregations

ChannelInfoMessage (com.jme3.network.message.ChannelInfoMessage)2 ClientRegistrationMessage (com.jme3.network.message.ClientRegistrationMessage)2 DisconnectInfo (com.jme3.network.ClientStateListener.DisconnectInfo)1 Endpoint (com.jme3.network.kernel.Endpoint)1 DisconnectMessage (com.jme3.network.message.DisconnectMessage)1