//CYCLONE MATRIX HOST NODE APPLICATION
//Hermann L. Johnson, 2019
//Free for unmodified distribution and non-commercial use.
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.zip.*;
public class ServerConnectionThread extends Thread
{
private ServerSocket serverSocket;
private int PORT;
private int MAX_CONNECTIONS;
private Vector<ServerThread> openSockets;
private DataManager data_manager;
private boolean intakeServer, zipped;
private boolean running;
public ServerConnectionThread(int port, int max_connections,
DataManager data_manager, boolean intake,
boolean zipped)
{
super("ServerConnectionThread-Upload:"+Integer.valueOf(port));
running = false;
PORT = port;
MAX_CONNECTIONS = max_connections;
intakeServer = intake;
this.data_manager = data_manager;
this.zipped = zipped;
openSockets = new Vector<ServerThread>();
}
public synchronized boolean running() {
return running;
}
public synchronized void setRunning(boolean newValue) {
running = newValue;
}
public void killThread() {
setRunning(false);
}
public synchronized int getNumActiveConnections() {
return openSockets.size();
}
private synchronized void checkSockets() {
for(int count=0;count<openSockets.size();count++) {
if(openSockets.elementAt(count).isClosed()) {
openSockets.removeElementAt(count);
count--;
}
}
}
public void run()
{
running = true;
try {
while(running) {
if(openSockets.size()<MAX_CONNECTIONS) {
serverSocket = new ServerSocket(PORT,0);
synchronized(this) {
openSockets.addElement(new ServerThread(
serverSocket.accept(), data_manager,
intakeServer, zipped));
openSockets.elementAt(openSockets.size()-1).start();
}
serverSocket.close();
}
Thread.sleep(200);
checkSockets();
//HEALTH REPORT?
}
} catch(Exception e) {
System.err.println("Problem operating server socket: "+
String.valueOf(PORT));
}
}
}