package tcpserver;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.nio.charset.Charset;
import java.util.List;
import Logger.Importance;
import Logger.Logger;
public class ServerProtokol {
Socket s;
BufferedReader vomClient;
PrintWriter zumClient;
Logger log = new Logger("log");
public ProcessBuilder pserver;
public Process server;
public BufferedReader serverOutput;
public BufferedWriter serverInput;
public boolean show = true;
public List<String> cmdline;
public ServerProtokol(Socket s , Logger log) {
try {
this.s = s;
vomClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
zumClient = new PrintWriter(s.getOutputStream() , true);
this.log = log;
} catch(IOException e) {
System.out.println("IO-Error");
log.log(Importance.ERROR, "Fehler");
e.printStackTrace();
}
}
public void startServer() {
try {
pserver = new ProcessBuilder("java", "-jar" , "server.jar" , "nogui");
server = pserver.start();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
OutputStream os = server.getOutputStream();
serverOutput = new BufferedReader(new InputStreamReader(server.getInputStream()));
serverInput = new BufferedWriter(new OutputStreamWriter(os));
show = true;
Thread t = new Thread() {
@Override
public void run() {
try {
for( ; show == true ; ) {
String str;
str = serverOutput.readLine();
if(str != null) {
if(str.contains("Done") && str.contains("For help, type")) {
zumClient.println("RUNNING");
}
//System.out.println(str);
// cmdline.add(str);
}
}
return;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t.start();
return;
}
public void stopServer() {
try {
serverInput.write("stop");
serverInput.newLine();
serverInput.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("STOPING...");
for( ;; ) {
String str;
try {
str = serverOutput.readLine();
if(str.contains("Stopping server") && str.contains("[Server thread/INFO]")) {
zumClient.println("STOPPED");
show = false;
return;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void transact() {
log.log(Importance.INFO, "Protokoll gestartet");
System.out.println("Protokoll gestartet");
try {
if(s.isClosed()) {
}
log.log(Importance.INFO, "Client verbunden");
System.out.println("Client verbunden");
String cmd = vomClient.readLine();
//System.out.println("Command received");
if(cmd.contains("LOGIN")) {
String[] args = cmd.split("%");
//System.out.println("USER " + args[1] + "> LOGIN");
//log.info("[" + args[1] + "]" + "LOGIN" + " User:" + args[2]);
log.log(Importance.INFO, "[" + args[1] + "]" + "LOGIN" + " User:" + args[2]);
//System.out.println("CLIENT " + args[1] + " HAS BUILT UP AN CONNECTION");
/*System.out.println("Username:" + args[2]);
System.out.println("Password Hash:" + args[3]);*/
if(ServerMain.c.containsKey(args[2])) {
//System.out.println("USERNAME ACCEPTED");
if(ServerMain.c.getPwd5(args[2]).equalsIgnoreCase(args[3])) {
zumClient.println("OK");
//System.out.println("CLIENT ACCEPTED");
log.log(Importance.INFO, "[" + args[1] + "]" + "Client akzeptiert");
ServerMain.loggedOnIp = args[1];
} else {
//System.out.println("PASSWORD NOT ACCEPTED");
zumClient.println("NOK");
log.log(Importance.INFO, "[" + args[1] + "]" + "Client nicht akzeptiert");
System.out.println("CLIENT NOT ACCEPTED");
s.close();
}
} else {
//System.out.println("USERNAME NOT ACCEPTED");
zumClient.println("NOK");
log.log(Importance.INFO, "[" + args[1] + "]" + "Client nicht akzeptiert");
System.out.println("CLIENT NOT ACCEPTED");
s.close();
}
//s.close();
} else if(cmd.equalsIgnoreCase("exit")) {
System.out.println("Protokollende");
System.exit(0);
} else if(cmd.contains("STATUS")) {
/* System.out.println("STATUS");
zumClient.println("false");
*/
String[] args = cmd.split("%");
log.log(Importance.INFO, "[" + args[1] + "]" + "STATUS");
if(ServerMain.loggedOnIp.equalsIgnoreCase(args[1])) {
//Läuft der Server?
zumClient.println("false");
} else {
s.close();
}
} else if(cmd.contains("DISCONNECT")) {
String[] args = cmd.split("%");
if(ServerMain.loggedOnIp.equalsIgnoreCase(args[1])) {
ServerMain.loggedOnIp = null;
log.log(Importance.INFO, "[" + args[1] + "]" + "Disconnect");
System.out.println("USER DISCONNECT");
} else {
s.close();
}
}else if(cmd.contains("START")) {
String[] args = cmd.split("%");
if(ServerMain.loggedOnIp.equalsIgnoreCase(args[1])) {
log.log(Importance.INFO, "[" + args[1] + "]" + "START");
System.out.println("USER STARTED THE SERVER");
zumClient.println("true");
startServer();
} else {
s.close();
}
} else if(cmd.contains("STOP")) {
String[] args = cmd.split("%");
System.out.println("SERVER IS STOPPING");
if(ServerMain.loggedOnIp.equalsIgnoreCase(args [1])) {
stopServer();
log.log(Importance.INFO, "[" + args[1] + "]" + "STOP");
System.out.println("USER STOPPED THE SERVER");
}
}else if(cmd.contains("GETCMD")) {
String[] args = cmd.split("%");
if(ServerMain.loggedOnIp.equalsIgnoreCase(args [1])) {
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(cmdline);
System.out.println("cmdline sent");
cmdline.clear();
}
}
//System.out.println("Kein Befehl");
} catch(SocketException e) {
if(e.getMessage().equalsIgnoreCase("Connection reset")) {
System.out.println("USER DISCONNECT");
} else {
e.printStackTrace();
System.out.println("IO-Fehler");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}