package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import framework.Anfragebearbeitung;
import framework.Unbegrenzter_Server;
public class Bearbeitung extends Anfragebearbeitung {
private int zeitDiff = 480;
// Variablen ( Spezielle ASCII Zeichen)
private static final char SOH = (char)1;
private static final char STX = (char)2;
private static final char ETX = (char)3;
private static final char EOT = (char)4;
private static final char LF = (char)10;
private static final char CR = (char)13;
private static final char RS = (char)30;
// Variablen von Datagram (empfangene Knotenrechener Informationen)
private String kr_appVersion;
private String kr_telegramTyp;
private String kr_senderId;
private String kr_empfaengerId;
private String kr_telegramId;
private String kr_antwortId;
private String kr_zehntelSek;
private String kr_sek;
private String kr_min;
private String kr_std;
private String kr_tag;
private String kr_monat;
private String kr_jahr;
private String kr_anzNutzdatenBl;
private String kr_Telegramlaenge;
// Variablen von Server
private String br_appVersion = "001"; // kann hier global verändert werden
private String br_telegramTyp= "";
private String br_senderId = "Bereichsrechner"; // kann hier global verändert werden
private String br_empfaengerId = "";
private int br_telegramId = Server.br_telegramId;
private String br_telegramId_str = "";
private String br_antwortId = "";
private String br_zeit_datum = "";
private String br_anzNutzdatenBl = "";
private String br_telegramlaenge = "";
public Bearbeitung(Unbegrenzter_Server server,Socket anfrage) {
super ( server, anfrage );
}
public void kommuniziere () {
wln("Client has connected..");
try {
// Streams initialisieren:
InputStream input = anfrage.getInputStream();
OutputStream output = anfrage.getOutputStream();
PrintWriter out = new PrintWriter ( output );
BufferedReader in = new BufferedReader (
new InputStreamReader ( input )
);
// Was will der Client?
String job;
job = in.readLine();
wln("job: " + job);
// überprüfen des Jobs
if (checkJob(job)){
displayVar();
out.println ( ack("000002") );
out.flush();
Server.br_telegramId++;
out.println ( ack("000005") );
out.flush();
}
else{
// Job nicht Okey
wln("Job not OK!");
out.println ("NAK");
out.flush();
}
// Streams schliessen
out.close();
in.close();
anfrage.close();
} catch (IOException e) {
wln ( "Fehler@kommuniziere: " + e.toString() );
}
}
// ********************** Hilfsmethoden *********************************
protected void verzoegerung (int time) {
// Künstlich um 10 Sek. hinauszögern:
try {
sleep ( time );
} catch (Exception e) {}
}
private void displayVar(){
// Variablen des Datagramms ausgeben
wln(" ");
wln("App. Version: " + kr_appVersion);
wln("Telegram Typ: " + kr_telegramTyp);
wln("Sender ID: " + kr_senderId);
wln("Empfänger ID: " + kr_empfaengerId);
wln("Telegram ID: " + kr_telegramId);
wln("Antwort ID: " + kr_antwortId);
wln("Datum (dd.mm.yy): " + kr_tag + "." + kr_monat + "." + kr_jahr);
wln("Zeit (hh.mm.ss/zs): " + kr_std + ":" + kr_min + ":" + kr_sek + "/" + kr_zehntelSek);
wln("Anzahl Nutzdatenblock: " + kr_anzNutzdatenBl);
wln("Telegramlänge: " + kr_Telegramlaenge);
wln(" ");
}
protected String eliminateUnderline(String str){
// Zeichen "_" werden herausgeschnitten
if (str.indexOf("_") != -1){
int i=0;
while (i < str.length()) {
if (str.charAt(i)=='_')
str = str.substring(0, i) + str.substring(i+1, str.length());
else i++;
}
}
return str;
}
protected String fillUpString (String str, String zeichen, int zLaenge, int hv){
// String (Argument 1) mit Zeichen (Argument 2) auf die Gesamt-String-Länge (Argument 3)
// hinten oder vorne (Argument 4, (1 für vorne, 0 für hinten)) auffüllen
int uLaenge = str.length();
if(hv == 1)
for (int i = 0; i < zLaenge-uLaenge; i++)
str = zeichen + str;
else if (hv == 0)
for (int i = 0; i < zLaenge-uLaenge; i++)
str = str + zeichen;
return str;
}
// ***********************************************************
// ***********************************************************
// ***********************************************************
protected boolean checkJob (String job){
// Ist Job korrekt? (Format, Länge, Start und Endzeichen etc.)
try{
// Erstes, letztes Zeichen und länge des Datagramms okey?
if (job.charAt(0) == SOH && job.endsWith("00"+EOT) && job.length() == 263){
// Formatierung des Datagramms in einzelne Strings
kr_appVersion = (job.substring(1, 4));
kr_telegramTyp = (job.substring(4, 10));
kr_senderId = eliminateUnderline(job.substring(10, 110));
kr_empfaengerId = eliminateUnderline(job.substring(110, 210));
kr_telegramId = (job.substring(210, 220));
kr_antwortId = (job.substring(220, 230));
kr_zehntelSek = (job.substring(230, 231));
kr_sek = (job.substring(231, 233));
kr_min = (job.substring(233, 235));
kr_std = (job.substring(235, 237));
kr_tag = (job.substring(237, 239));
kr_monat = (job.substring(239, 241));
kr_jahr = (job.substring(241, 245));
kr_anzNutzdatenBl = (job.substring(245, 250));
kr_Telegramlaenge = (job.substring(250, 260));
// Stimmt die Empfänger ID nicht mit meiner überein?
if (!kr_empfaengerId.equals(br_senderId)){
return false;
}
// Beinhalten Zahlenfelder auch wirklich Zahlen?
// und Stimmen die vorgegebenen Wertebereiche?
int tmp;
long tmp2;
tmp = Integer.parseInt(kr_appVersion);
if (!(tmp >= 1 && tmp <= 255))
throw new NumberFormatException();
tmp = Integer.parseInt(kr_telegramTyp);
if (!(tmp >= 0 && tmp <= 999999))
throw new NumberFormatException();
tmp2 = Long.parseLong(kr_telegramId);
if (!(tmp2 >= 1 && tmp2 <= 4294967295l))
throw new NumberFormatException();
tmp2 = Integer.parseInt(kr_antwortId);
if (!(tmp2 >= 0 && tmp2 <= 4294967295l))
throw new NumberFormatException();
tmp = Integer.parseInt(kr_anzNutzdatenBl);
if (!(tmp >= 0 && tmp <= 65535))
throw new NumberFormatException();
tmp2 = Integer.parseInt(kr_Telegramlaenge);
if (!(tmp2 >= 0 && tmp2 <= 4294967295l))
throw new NumberFormatException();
// Konvertierung der Zeit und Datums Variablen von String zu Integer
int zehntel = Integer.parseInt(kr_zehntelSek);
int sek = Integer.parseInt(kr_sek);
int min = Integer.parseInt(kr_min);
int std = Integer.parseInt(kr_std);
int tag = Integer.parseInt(kr_tag);
int monat = Integer.parseInt(kr_monat);
int jahr = Integer.parseInt(kr_jahr);
// Stimmen die Wertebereiche für Zeit und Datum?
if (!(zehntel >= 0 && zehntel <= 9))
throw new NumberFormatException();
if (!(sek >= 0 && sek <= 59))
throw new NumberFormatException();
if (!(min >= 0 && min <= 59))
throw new NumberFormatException();
if (!(std >= 0 && std <= 23))
throw new NumberFormatException();
if (!(tag >= 1 && tag <= 31))
throw new NumberFormatException();
if (!(monat >= 1 && monat <= 12))
throw new NumberFormatException();
if (!(jahr >= 1995 && jahr <= 2100))
throw new NumberFormatException();
// Aktuelle Zeit in einzelnen Variablen speichern
Date jetzt = new Date();
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy");
int jYear = Integer.parseInt(formatter.format( jetzt ));
formatter = new SimpleDateFormat ("MM");
int jMonth = Integer.parseInt(formatter.format( jetzt ));
formatter = new SimpleDateFormat ("dd");
int jDay = Integer.parseInt(formatter.format( jetzt ));
formatter = new SimpleDateFormat ("HH");
int jHour = Integer.parseInt(formatter.format( jetzt ));
formatter = new SimpleDateFormat ("mm");
int jMin = Integer.parseInt(formatter.format( jetzt ));
formatter = new SimpleDateFormat ("ss");
int jSec = Integer.parseInt(formatter.format( jetzt ));
// Ist Datagram Zeitstempel nicht neuer als aktuelle Zeit?
// und: Ist Datagram Zeitstempel bis auf den wert in "zeitDiff"
// gleich der aktuellen Zeit?
if (!(jYear == jahr && jMonth == monat && jDay == tag &&
min+std*60+zeitDiff >= jHour*60+jMin &&
min+std*60 <= jHour*60+jMin ))
throw new NumberFormatException();
// falls alles zutrifft --> Datagram okey
wln("--> Job OK");
return true;
} else return false;
} catch(Exception e){
wln ( "Fehler: " + e ); return false;
}
}
// ***********************************************************
// ***********************************************************
// ***********************************************************
private String ack(String telegramTyp){
// Empfangsbestätigung an Client schicken
// initialisieren der Datenfelder
br_telegramTyp = telegramTyp;
br_empfaengerId = kr_senderId;
br_telegramId_str = fillUpString(Integer.toString(br_telegramId), "0", 10, 1);
br_telegramId++;
br_antwortId = kr_telegramId;
br_anzNutzdatenBl = "00000";
br_telegramlaenge = "0000000263";
//Zeit und Datum einfügen
Date jetzt = new Date();
SimpleDateFormat formatter = new SimpleDateFormat ("ssmmHHddMMyyyy");
br_zeit_datum = "0" + formatter.format(jetzt);
if(br_telegramTyp.equals("000002"))
return SOH + br_appVersion + br_telegramTyp + fillUpString(br_senderId, "_", 100, 0) +
fillUpString(br_empfaengerId, "_", 100, 0) + br_telegramId_str + br_antwortId +
br_zeit_datum + br_anzNutzdatenBl + br_telegramlaenge + "00" + EOT;
else
return SOH + br_appVersion + br_telegramTyp + fillUpString(br_senderId, "_", 100, 0) +
fillUpString(br_empfaengerId, "_", 100, 0) + br_telegramId_str + br_antwortId +
br_zeit_datum + br_anzNutzdatenBl + br_telegramlaenge + "00" + " DATEN PAKET " + EOT;
}
}