import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
+import uk.ac.ntu.n0521366.wsyd.libs.message.MessageNetworkStream;
/**
* Dual-use multithreading network TCP server that can be used stand-alone
ServerSocket _serverSocket;
NetworkStreamManager _streamManager;
+
+ protected ArrayList<ConnectionEstablishedEventListener> _ConnectionEstablishedEventListeners;
/**
* Construct the server with a Logger.
public NetworkServerTCP(WSYD_SocketAddress socketAddress, String title, ServiceAddressMap serviceToHostMap, NetworkStreamManager manager, Logger logger) {
super(socketAddress, title, serviceToHostMap, logger);
this._streamManager = manager;
+ this._ConnectionEstablishedEventListeners = new ArrayList<>();
}
/**
//System.err.println("Before");
Socket connectionSocket = _serverSocket.accept();
NetworkStream newStream = new NetworkStream(connectionSocket, _streamManager);
- _streamManager.addStream(0, newStream);
+ long userID = _streamManager.addStream(0, newStream);
+ // workaround to enable firing a ConnectionEstablishedEvent in process() on the owner thread
+ NetworkMessage temp = new NetworkMessage("triggerConnectionEstablishedEvent", null, new MessageNetworkStream(newStream));
+ publish(temp);
log(Level.INFO, _title, MessageFormat.format("Incoming connection from {0}:{1}", connectionSocket.getInetAddress().getCanonicalHostName(), Integer.toString(connectionSocket.getPort())));
+
+ // add or update the last-seen time of the Sender host in the known services map
+ ServiceAddressMap.LastSeenHost host = new ServiceAddressMap.LastSeenHost((InetSocketAddress)connectionSocket.getRemoteSocketAddress());
+ this._serviceToHostMap.put(Long.toString(userID), host);
+ log(Level.INFO, _title, MessageFormat.format("Added \"{0}\" to service map", userID));
+ System.err.println("Added new TCP stream successfully");
}
catch (SocketTimeoutException e) {
//Nothing to be done
return false;
}
+ private void fireConnectionEstablishedEvent(NetworkStream stream) {
+ ConnectionEstablishedEvent event = new ConnectionEstablishedEvent(this, stream);
+ for (ConnectionEstablishedEventListener listener: this._ConnectionEstablishedEventListeners) {
+ listener.connectionEstablished(event);
+ }
+
+ }
+ public synchronized void addConnectionEstablisedEventListener(ConnectionEstablishedEventListener listener) {
+ _ConnectionEstablishedEventListeners.add(listener);
+ }
+
+ public synchronized void removeConnectionEstablishedEventListener(ConnectionEstablishedEventListener listener) {
+ for (ConnectionEstablishedEventListener el : _ConnectionEstablishedEventListeners)
+ if (el == listener) {
+ _ConnectionEstablishedEventListeners.remove(listener);
+ break;
+ }
+ }
+
+
/* XXX: Methods below here all execute on the GUI Event Dispatch Thread */
/**
protected void done() {
}
+
+ @Override
+ protected NetworkMessage sendMessage() {
+ return null;
+ }
+
+ @Override
+ protected void process(List<NetworkMessage> list) {
+ System.err.println("process()");
+ for (NetworkMessage nm: list) {
+ MessageNetworkStream message = (MessageNetworkStream)nm.getMessage();
+ System.err.println("ConnectionEstablished dispatched for " + message._stream._key);
+ fireConnectionEstablishedEvent(message._stream);
+
+ }
+ }
}