import java.io.IOException;
import java.net.Socket;
+import java.net.UnknownHostException;
import be.nikiroo.utils.Version;
* the port to listen on, or 0 to assign any unallocated port
* found (which can later on be queried via
* {@link ServerString#getPort()}
- * @param ssl
- * use a SSL connection (or not)
+ * @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 ServerString(int port, boolean ssl) throws IOException {
- super(port, ssl);
+ public ServerString(int port, String key) throws IOException {
+ super(port, key);
}
/**
* the server name (only used for debug info and traces)
* @param port
* the port to listen on
- * @param ssl
- * use a SSL connection (or not)
+ * @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 ServerString(String name, int port, boolean ssl) throws IOException {
- super(name, port, ssl);
+ public ServerString(String name, int port, String key) throws IOException {
+ super(name, port, key);
}
@Override
protected ConnectActionServer createConnectActionServer(Socket s) {
- return new ConnectActionServerString(s) {
+ return new ConnectActionServerString(s, key) {
@Override
public void action(Version clientVersion) throws Exception {
- try {
- for (String data = rec(); data != null; data = rec()) {
- String rep = null;
- try {
- rep = onRequest(this, clientVersion, data);
- } catch (Exception e) {
- onError(e);
- }
-
- if (rep == null) {
- rep = "";
+ long id = getNextId();
+ for (String data = rec(); data != null; data = rec()) {
+ String rep = null;
+ try {
+ rep = onRequest(this, clientVersion, data, id);
+ if (isClosing()) {
+ return;
}
+ } catch (Exception e) {
+ onError(e);
+ }
- send(rep);
+ if (rep == null) {
+ rep = "";
}
- } catch (NullPointerException e) {
- // Client has no data any more, we quit
- getTraceHandler()
- .trace(getName()
- + ": client has data no more, stopping connection");
+ send(rep);
}
+
+ onRequestDone(id, getBytesReceived(), getBytesSent());
}
@Override
- public void connect() {
- try {
- super.connect();
- } finally {
- count(-1);
- }
+ protected void onError(Exception e) {
+ ServerString.this.onError(e);
}
};
}
+ @Override
+ protected ConnectActionClient getConnectionToMe()
+ throws UnknownHostException, IOException {
+ return new ConnectActionClientString(new Socket((String) null,
+ getPort()), key);
+ }
+
/**
* This is the method that is called on each client request.
* <p>
* the client version
* @param data
* the data sent by the client
+ * @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
*
* @throws Exception
* in case of an exception, the error will only be logged
*/
- abstract protected String onRequest(ConnectActionServerString action,
- Version clientVersion, String data) throws Exception;
+ protected String onRequest(ConnectActionServerString action,
+ Version clientVersion, String 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.
+ * <p>
+ * Please use the version with key encryption (this deprecated
+ * version uses an empty key when <tt>ssl</tt> is TRUE and no
+ * key (NULL) when <tt>ssl</tt> is FALSE).
+ */
+ @Deprecated
+ public ServerString(int port, boolean ssl) throws IOException {
+ this(port, ssl ? "" : null);
+ }
+
+ /**
+ * @deprecated SSL support has been replaced by key-based encryption.
+ * <p>
+ * Please use the version with key encryption (this deprecated
+ * version uses an empty key when <tt>ssl</tt> is TRUE and no
+ * key (NULL) when <tt>ssl</tt> is FALSE).
+ */
+ @Deprecated
+ public ServerString(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 String onRequest(ConnectActionServerString action,
+ Version version, String data) throws Exception {
+ return null;
+ }
}