Implemented TCP streams for object serialization
[WeStealzYourDataz.git] / src / uk / ac / ntu / n0521366 / wsyd / libs / net / NetworkServerTCP.java
index 6c48624..710e443 100644 (file)
  */
 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
@@ -34,8 +41,42 @@ import java.net.SocketException;
  * @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.
      * 
@@ -45,7 +86,21 @@ public class NetworkServerTCP extends NetworkServerAbstract {
      */
     @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
     }
     
     /**
@@ -71,7 +126,12 @@ public class NetworkServerTCP extends NetworkServerAbstract {
      */
     @Override
     public void serverClose() throws SocketException {
-        
+        if (this._serverSocket != null)
+            try {
+                this._serverSocket.close();
+        } catch (IOException ex) {
+            throw new SocketException(ex.getMessage());
+        }
     }
     
     /**
@@ -85,6 +145,21 @@ public class NetworkServerTCP extends NetworkServerAbstract {
     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;
     }