public abstract class BasicConnection extends Thread {
/* log4j rootLogger laden */
protected static Logger logger = Logger.getRootLogger();
protected String ip;
protected boolean running;
protected int machineType;
protected Socket socket;
protected BufferedInputStream in;
protected PrintStream out;
protected String input;
protected String realInput;
protected boolean dataProcessed = false;
/* Programmbuffer */
protected ArrayList<String> programsToSend;
public BasicConnection(Socket socket, String name, ThreadGroup threadgroup, int priority, int machineType) {
/* Thread in die ThreadGroup eintragen */
super(threadgroup, name);
this.setPriority(priority);
/* Daten übernehmen */
this.socket = socket;
this.machineType = machineType;
/* IP Addresse extrahieren */
ip = socket.getInetAddress().getHostAddress();
/* Datenströme erstellen */
try {
in = new BufferedInputStream(socket.getInputStream());
out = new PrintStream(socket.getOutputStream());
} catch (IOException ioe) {
logger.error("Datenströme konnten nicht erstellt werden", ioe);
}
/* Timeout setzen */
try {
socket.setSoTimeout(Settings.getInt("LAN", "timeout_millis")); // sind 500ms
} catch (SocketException se) {
logger.error("Es konnte kein Timeout festgelegt werden", se);
return;
}
/* Programmbuffer initialisieren */
programsToSend = new ArrayList<String>(5);
running = true;
start();
}
@Override
public void run() {
try {
while (running) {
try {
doInititalSendings();
/* eingelesene Daten zurücksetzen */
input = "";
if (Settings.getBoolean("DEBUG", "socketinput")) logger.debug("--- Lese von Socket ---");
while (true) {
/* Solange lesen bis Timeout auftritt */
int r = in.read();
if (Settings.getBoolean("DEBUG", "socketinput")) logger.debug(r);
input += (char)r;
}
} catch (SocketTimeoutException stoe) {
if (Settings.getBoolean("DEBUG", "socketinput")) logger.debug("--- Lesen der Daten beendet ---");
dataProcessed = false;
long start = System.currentTimeMillis();
processData();
if (dataProcessed) logger.info("Daten wurden bearbeitet. Bearbeitungszeit: " + (System.currentTimeMillis() - start) + "ms");
}
}
} catch (SocketException se) {
logger.info("Verbindung zu " + ip + " wurde unterbrochen");
logger.debug(null, se);
} catch (IOException ioe) {
logger.info("Es ist ein Verbindungsfehler aufgetreten bei: " + ip);
logger.debug(null, ioe);
} catch (Exception e) {
logger.error("Nicht spezifizierter Verbindungsfehler aufgetreten bei: " + ip, e);
} finally {
/* Verbindung löschen */
ConnectionManager.killConnection(ip);
logger.debug("Connection ausgetragen: " + getName());
}
logger.info("Verbindungsthread '" + getName() + "' wurde beendet");
}
protected abstract void processData();
protected abstract void doInititalSendings() throws IOException;
protected boolean checkInput() {
if (!RuleManager.checkInput(input)) {
logger.info("Eingehendes Programm wurde abgewiesen");
logger.debug("Eingehender Input: " + input);
/* Eintrag im SocketMonitor hinterlassen */
SocketMonitorManager.addSocketEvent(ip, "Server", input, "Abgewiesen (Regelverstoß)");
return false;
}
return true;
}
protected String getZeros(int count) throws IOException {
String zeros = "";
for (int i = 0; i < count; i++) {
zeros += (char)0;
}
return zeros;
}
protected void sendZeros(int count) throws IOException {
for (int i = 0; i <= count; i++) {
out.write(0);
}
}
public void addProgramToSend(String programCode) {
programsToSend.add(programCode);
}
protected String trimZeros(String input) {
String result = input.replaceAll((char)0 + "", "");
return result;
}
public void shutdown() {
running = false;
try {
if (socket != null) socket.close();
if (in != null) in.close();
if (out != null) out.close();
} catch (IOException ioe) {
logger.error("", ioe);
}
}
public String getIP() {
return ip;
}
@Override
public String toString() {
return getName() + " [" + ip+ "]";
}
}