package be.nikiroo.utils.serial.server; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import be.nikiroo.utils.Version; /** * This class implements a simple server that can listen for connections and * send/receive objects. *

* Note: this {@link ServerObject} has to be discarded after use (cannot be * started twice). * * @author niki */ abstract public class ServerObject extends Server { /** * Create a new server that will start listening on the network when * {@link ServerObject#start()} is called. * * @param port * the port to listen on, or 0 to assign any unallocated port * found (which can later on be queried via * {@link ServerObject#getPort()} * @param key * an optional key to encrypt all the communications (if NULL, * everything will be sent in clear text) * * @throws IOException * in case of I/O error * @throws UnknownHostException * if the IP address of the host could not be determined * @throws IllegalArgumentException * if the port parameter is outside the specified range of valid * port values, which is between 0 and 65535, inclusive */ public ServerObject(int port, String key) throws IOException { super(port, key); } /** * Create a new server that will start listening on the network when * {@link ServerObject#start()} is called. * * @param name * the server name (only used for debug info and traces) * @param port * the port to listen on * @param key * an optional key to encrypt all the communications (if NULL, * everything will be sent in clear text) * * @throws IOException * in case of I/O error * @throws UnknownHostException * if the IP address of the host could not be determined * @throws IllegalArgumentException * if the port parameter is outside the specified range of valid * port values, which is between 0 and 65535, inclusive */ public ServerObject(String name, int port, String key) throws IOException { super(name, port, key); } @Override protected ConnectActionServer createConnectActionServer(Socket s) { return new ConnectActionServerObject(s, key) { @Override public void action(Version clientVersion) throws Exception { long id = getNextId(); try { for (Object data = rec(); true; data = rec()) { Object rep = null; try { rep = onRequest(this, clientVersion, data, id); if (isClosing()) { return; } } catch (Exception e) { onError(e); } send(rep); } } catch (NullPointerException e) { // Client has no data any more, we quit onRequestDone(id, getBytesReceived(), getBytesSent()); } } @Override protected void onError(Exception e) { ServerObject.this.onError(e); } }; } @Override protected ConnectActionClient getConnectionToMe() throws UnknownHostException, IOException { return new ConnectActionClientObject(new Socket((String) null, getPort()), key); } /** * This is the method that is called on each client request. *

* You are expected to react to it and return an answer (which can be NULL). * * @param action * the client action * @param data * the data sent by the client (which can be NULL) * @param id * an ID to identify this request (will also be re-used for * {@link ServerObject#onRequestDone(long, long, long)}. * * @return the answer to return to the client (which can be NULL) * * @throws Exception * in case of an exception, the error will only be logged */ protected Object onRequest(ConnectActionServerObject action, Version clientVersion, Object data, @SuppressWarnings("unused") long id) throws Exception { // TODO: change to abstract when deprecated method is removed // Default implementation for compat return onRequest(action, clientVersion, data); } // Deprecated // /** * @deprecated SSL support has been replaced by key-based encryption. *

* Please use the version with key encryption (this deprecated * version uses an empty key when ssl is TRUE and no * key (NULL) when ssl is FALSE). */ @Deprecated public ServerObject(int port, boolean ssl) throws IOException { this(port, ssl ? "" : null); } /** * @deprecated SSL support has been replaced by key-based encryption. *

* Please use the version with key encryption (this deprecated * version uses an empty key when ssl is TRUE and no * key (NULL) when ssl is FALSE). */ @Deprecated public ServerObject(String name, int port, boolean ssl) throws IOException { this(name, port, ssl ? "" : null); } /** * Will be called if the correct version is not overrided. * * @deprecated use the version with the id. * * @param action * the client action * @param data * the data sent by the client * * @return the answer to return to the client * * @throws Exception * in case of an exception, the error will only be logged */ @Deprecated @SuppressWarnings("unused") protected Object onRequest(ConnectActionServerObject action, Version version, Object data) throws Exception { return null; } }