package streamExample.coserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import streamExample.utils.HostData;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class CoordinationServerAgent
{
protected final static Logger logger = LoggerFactory.getLogger(CoordinationServerAgent.class);
private ServerSocket serverSocket = null;
private Socket clientSocket;
protected final ArrayList<InetSocketAddress> clients;
public CoordinationServerAgent() {
this.clients = new ArrayList<InetSocketAddress>();
try {
serverSocket = new ServerSocket(CoordinationServer.COORDINATION_SERVER_PORT);
logger.debug("Coordination server running..");
run();
} catch (IOException e) {
logger.debug("Cannot start coordination server! Message: " + e.getMessage());
}
}
public void run() {
while(true) {
try {
clientSocket = serverSocket.accept();
logger.debug("\nIncoming connection!");
ObjectOutputStream outToClient = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream inFromClient = new ObjectInputStream(clientSocket.getInputStream());
HostData hostData = (HostData) inFromClient.readObject();
InetSocketAddress clientAddress =
new InetSocketAddress(clientSocket.getInetAddress(), hostData.getPort());
logger.debug("Connected user: " + clientSocket.getInetAddress() + ":" + hostData.getPort());
logger.debug("Received message: " + hostData.getType());
if((clients.size() == 0 && hostData.getType().equals(CoordinationServer.SERVER_CONNECTING))
|| (clients.size() > 0 && hostData.getType().equals(CoordinationServer.CLIENT_CONNECTING)))
{
clients.add(clientAddress);
logger.debug("Added " + clientAddress.toString() + " to a list");
}
if(clients.size() > 1 && hostData.getType().equals(CoordinationServer.CLIENT_CONNECTING)) {
InetSocketAddress address = getAddressForChannel();
logger.debug("Sending message: " + address.toString());
outToClient.writeObject(address);
}
} catch (IOException e) {
logger.debug(e.getMessage() + e.getStackTrace());
} catch (ClassNotFoundException e) {
logger.debug(e.getMessage() + e.getStackTrace());
} finally {
try {
clientSocket.close();
} catch (IOException e) {
logger.debug(e.getMessage()+e.getStackTrace());
throw new RuntimeException(e);
}
}
}
}
private InetSocketAddress getAddressForChannel() {
int index = clients.size() - 1;
index = (index % 2 == 1) ? index/2 : (index-1)/2;
return clients.get(index);
}
}