package games.strategy.net; import java.io.Serializable; import java.net.InetSocketAddress; /** * A simple way to connect multiple socket end points. * An IMessenger listens for incoming messages, and sends * them to all registered listeners. * Messages are recieved and sent in order. Note that message listeners are multi threaded, in * that they process messages from multiple nodes at the same time, but no more than 1 message * from any particular node at a time. */ public interface IMessenger { /** * Send a message to the given node. Returns immediately. * If the message cannot be delivered, this method will not throw an exception, but will * fail silently. */ void send(Serializable msg, INode to); /** * Send a message to all nodes. */ void broadcast(Serializable msg); /** * Listen for messages. */ void addMessageListener(IMessageListener listener); /** * Stop listening to messages. */ void removeMessageListener(IMessageListener listener); /** * Listen for errors. */ void addErrorListener(IMessengerErrorListener listener); /** * Stop listening for errors. */ void removeErrorListener(IMessengerErrorListener listener); /** * Get the local node. */ INode getLocalNode(); /** * test the connection. */ boolean isConnected(); /** * Shut the connection down. */ void shutDown(); /** * Am I the server node? * There should only be one server node, and it should exist before other nodes. */ boolean isServer(); /** * @return local node if we are a server node. */ INode getServerNode(); /** * Get the socket address to which we talk to the server. * This may be different than getServerNode().getSocketAddress() since * the server will report the socket that he thinks the server is running on, * if the server is behind a firewall, or a NAT, then this socket will be * different than the actual port we use. */ InetSocketAddress getRemoteServerSocketAddress(); // TODO: add this into next release: boolean isShutDown(); }