Ich bin dabei, eine kleine Client-Server Anwendung um zu setzen (Studienprojekt).
Ich habe mit Hilfe verschiedener Beispiele aus dem Netz bereits eine Serveranwednugn realisiert, welche jedem Client einen eigenen Thread zuweist.
In den Beispielen lief der Server immer ewig
Ich moechte aber den Server ueber eine Konsoleneingabe beenden koennen.
Das lieft auch ueber
ganz gut, nur sobald ein Client verbunden ist, funktioniert das nicht mehr. Zudem scheint die Schleife für unnötige CPU Last zu sorgen. Teilweise nimmt die Anwendung dann 99% eines Kerns in Anspruch.
Hier meine ServerHauptprogramm
Die Klasse fuer die Client Threads
Ich habe mit Hilfe verschiedener Beispiele aus dem Netz bereits eine Serveranwednugn realisiert, welche jedem Client einen eigenen Thread zuweist.
In den Beispielen lief der Server immer ewig
Java:
while(true){...}
Ich moechte aber den Server ueber eine Konsoleneingabe beenden koennen.
Das lieft auch ueber
Java:
while(!myString.equals("H"){...}
Hier meine ServerHauptprogramm
Java:
//import nicht aufgelistet
public class tcpServer extends Thread{
static Vector ThreadVector = new Vector();//hier lege ich alle Clients ab um Sie spaeter sauber zu beenden, Methode fehlt noch
static String stopString; //wird von der Konsole eingelesen
public tcpServer(){
//leer
}
public static void main(String[] args) throws IOException {
tcpServer myServer = new tcpServer(); //neues tcpServer Object
myServer.start(); //starten als Thread
stopString=("");
//jetzt kommt die Problemschleife
while(!stopString.equals("H")){
stopString=StdInput.readString().toUpperCase().trim();
}
try{
//myServer.join();// hiermit funktioniert es, aber dann lauft der Server ewig
myServer.interrupt(); //funktioniert nicht
currentThread().interrupt(); //funktioniert nicht
System.out.println("myServer "+myServer.getName()+" : "+myServer.getState()); //Ausgabe Runnable....
System.out.println("current "+currentThread().getName()+" : "+myServer.getState()); //Ausgabe Runnable....
System.exit(0);
}catch(Exception e){
e.printStackTrace();
System.out.println(e);
}
}
@Override
public void run(){
System.out.println("Ich bin Thread: "+currentThread().getName()+" warte auf Clients");
int i=0;
try{
ServerSocket myServerSocket = new ServerSocket(4200);
System.out.println(myServerSocket.getInetAddress());//Kontrollausgabe fuer mich
while(!isInterrupted()){ //muss ich vielleicht hier etwas aendern?
Socket aSocket = new Socket();
aSocket = myServerSocket.accept(); //wartet auf den Client
System.out.println("Ein Client ist da " +aSocket.toString());
tcpServerThread aThread = new tcpServerThread(aSocket);//fuer jeden Client ein neuer Thread
synchronized(aThread){
ThreadVector.add(i, aThread);
aThread.start();
}
i++;
}
}catch (Exception e){
System.out.println(e);
}
}
}
Die Klasse fuer die Client Threads
Java:
public class tcpServerThread extends Thread{
private Socket mySocket;
public tcpServerThread(Socket aSocket){
this.mySocket = aSocket;
}
@Override
public void run(){
System.out.println("Ich bin Thread: "+currentThread().getName()+" :"+mySocket.toString());//Kontrollausgabe fuer mich
try{
BufferedReader myback = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
String back = myback.readLine(); //lesen vom Client , der schickt ein "hello\n"
System.out.println(back);
}catch(Exception e){
e.printStackTrace();
System.out.println(e);
}
}
}