PSp..om e84d8300dd Modified Client/Server to support alternate channels. The
server can configure additional ports that will be sent to
the client upon connection.  These channels can be used to
send messages in parallel to the normal messages.  This is
useful to keeping several separate command pathways flowing
smoothly despite potentially large messages on one channel.


git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8938 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
2011-12-16 10:28:50 +00:00

187 lines
7.0 KiB
Java

/*
* Copyright (c) 2011 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.network;
import java.util.Collection;
/**
* Represents a host that can send and receive messages to
* a set of remote client connections.
*
* @version $Revision$
* @author Paul Speed
*/
public interface Server
{
/**
* Returns the 'game name' for this server. This should match the
* 'game name' set on connecting clients or they will be turned away.
*/
public String getGameName();
/**
* Returns the game-specific version of this server used for detecting
* mismatched clients.
*/
public int getVersion();
/**
* Sends the specified message to all connected clients.
*/
public void broadcast( Message message );
/**
* Sends the specified message to all connected clients that match
* the filter. If no filter is specified then this is the same as
* calling broadcast(message) and the message will be delivered to
* all connections.
* <p>Examples:</p>
* <pre>
* // Broadcast to connections: conn1, conn2, and conn3
* server.broadcast( Filters.in( conn1, conn2, conn3 ), message );
*
* // Broadcast to all connections exception source
* server.broadcast( Filters.notEqualTo( source ), message );
* </pre>
*/
public void broadcast( Filter<? super HostedConnection> filter, Message message );
/**
* Sends the specified message over the specified alternate channel to all connected
* clients that match the filter. If no filter is specified then this is the same as
* calling broadcast(message) and the message will be delivered to
* all connections.
* <p>Examples:</p>
* <pre>
* // Broadcast to connections: conn1, conn2, and conn3
* server.broadcast( Filters.in( conn1, conn2, conn3 ), message );
*
* // Broadcast to all connections exception source
* server.broadcast( Filters.notEqualTo( source ), message );
* </pre>
*/
public void broadcast( int channel, Filter<? super HostedConnection> filter, Message message );
/**
* Start the server so that it will began accepting new connections
* and processing messages.
*/
public void start();
/**
* Adds an alternate channel to the server, using the specified port. This is an
* entirely separate connection where messages are sent and received in parallel
* to the two primary default channels. All channels must be added before the connection
* is started.
* Returns the ID of the created channel for use when specifying the channel in send or
* broadcast calls. The ID is returned entirely out of convenience since the IDs
* are predictably incremented. The first channel is 0, second is 1, and so on.
*/
public int addChannel( int port );
/**
* Returns true if the server has been started.
*/
public boolean isRunning();
/**
* Closes all client connections, stops and running processing threads, and
* closes the host connection.
*/
public void close();
/**
* Retrieves a hosted connection by ID.
*/
public HostedConnection getConnection( int id );
/**
* Retrieves a read-only collection of all currently connected connections.
*/
public Collection<HostedConnection> getConnections();
/**
* Returns true if the server has active connections at the time of this
* call.
*/
public boolean hasConnections();
/**
* Adds a listener that will be notified when new hosted connections
* arrive.
*/
public void addConnectionListener( ConnectionListener listener );
/**
* Removes a previously registered connection listener.
*/
public void removeConnectionListener( ConnectionListener listener );
/**
* Adds a listener that will be notified when any message or object
* is received from one of the clients.
*
* <p>Note about MessageListener multithreading: on the server, message events may
* be delivered by more than one thread depending on the server
* implementation used. Listener implementations should treat their
* shared data structures accordingly and set them up for multithreaded
* access. The only threading guarantee is that for a single
* HostedConnection, there will only ever be one thread at a time
* and the messages will always be delivered to that connection in the
* order that they were delivered. This is the only restriction placed
* upon server message dispatch pool implementations.</p>
*/
public void addMessageListener( MessageListener<? super HostedConnection> listener );
/**
* Adds a listener that will be notified when messages of the specified
* types are received from one of the clients.
*/
public void addMessageListener( MessageListener<? super HostedConnection> listener, Class... classes );
/**
* Removes a previously registered wildcard listener. This does
* not remove this listener from any type-specific registrations.
*/
public void removeMessageListener( MessageListener<? super HostedConnection> listener );
/**
* Removes a previously registered type-specific listener from
* the specified types.
*/
public void removeMessageListener( MessageListener<? super HostedConnection> listener, Class... classes );
}