*/
package uk.ac.ntu.n0521366.wsyd.libs.net;
+import java.io.IOException;
+import java.net.InetSocketAddress;
import java.net.ServerSocket;
+import java.net.Socket;
import java.net.SocketException;
+import java.net.SocketTimeoutException;
+import java.text.MessageFormat;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Dual-use multithreading network TCP server that can be used stand-alone
* @author TJ <hacker@iam.tj>
*/
public class NetworkServerTCP extends NetworkServerAbstract {
+
ServerSocket _serverSocket;
+
+ NetworkStreamManager _streamManager;
+
+ /**
+ * Construct the server with a Logger.
+ *
+ * No socket is opened.
+ *
+ * @param socketAddress The socket to listen on
+ * @param title source identifier for use in log messages and sent NetworkMessage objects
+ * @param serviceToHostMap the map object used for host <> InetSocketAddress lookups
+ * @param manager
+ * @param logger An instance of Logger to be used by all objects of this class
+ */
+ public NetworkServerTCP(WSYD_SocketAddress socketAddress, String title, ServiceAddressMap serviceToHostMap, NetworkStreamManager manager, Logger logger) {
+ super(socketAddress, title, serviceToHostMap, logger);
+ this._streamManager = manager;
+ }
+ /**
+ * Construct the server without a Logger.
+ *
+ * No socket is opened.
+ *
+ * @param socketAddress The socket to listen on
+ * @param title source identifier for use in log messages and sent NetworkMessage objects
+ * @param serviceToHostMap the map object used for host <> InetSocketAddress lookups
+ * @param manager
+ */
+ public NetworkServerTCP(WSYD_SocketAddress socketAddress, String title, ServiceAddressMap serviceToHostMap, NetworkStreamManager manager) {
+ super(socketAddress, title, serviceToHostMap);
+ this._streamManager = manager;
+ }
+
/**
* Open the socket ready for accepting connections.
*
*/
@Override
public void serverOpen() throws SocketException {
+ try {
+ _serverSocket = new ServerSocket(_socketAddress.getPort(), 50, _socketAddress.getAddress());
+ } catch (IOException ex) {
+ throw new SocketException(ex.getMessage());
+ }
+ _serverSocket.setSoTimeout(100);
+ if (_socketAddress.getPort() == Network.PORTS_EPHEMERAL) {
+ // reflect the actual port in use if an ephermal port was requested
+ InetSocketAddress actualSA = (InetSocketAddress)_serverSocket.getLocalSocketAddress();
+ _socketAddress.setAddress(actualSA.getAddress());
+ _socketAddress.setPort(actualSA.getPort());
+ }
+ //log(Level.FINEST, _title, MessageFormat.format("Connection from {0}:{1}", _socketAddress.getAddress().getCanonicalHostName(), Integer.toString(_socketAddress.getPort())));
+ // TODO: Complete this implementation
}
/**
*/
@Override
public void serverClose() throws SocketException {
-
+ if (this._serverSocket != null)
+ try {
+ this._serverSocket.close();
+ } catch (IOException ex) {
+ throw new SocketException(ex.getMessage());
+ }
}
/**
public boolean serverListen() {
boolean result = false;
+ try {
+ //System.err.println("Before");
+ Socket connectionSocket = _serverSocket.accept();
+ NetworkStream newStream = new NetworkStream(connectionSocket, _streamManager);
+ _streamManager.addStream(0, newStream);
+ log(Level.INFO, _title, MessageFormat.format("Incoming connection from {0}:{1}", connectionSocket.getInetAddress().getCanonicalHostName(), Integer.toString(connectionSocket.getPort())));
+ }
+ catch (SocketTimeoutException e) {
+ //Nothing to be done
+ }
+ catch (IOException e) {
+ // Nothing to be done
+ System.err.println("Incoming connection caused exception...");
+ }
+
return false;
}