Multithreaded Server ueber Konsole beenden

Status
Nicht offen für weitere Antworten.

vsk

Aktives Mitglied
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
Java:
while(true){...}

Ich moechte aber den Server ueber eine Konsoleneingabe beenden koennen.
Das lieft auch ueber
Java:
while(!myString.equals("H"){...}
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
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);
        }
    }
}
 
S

SlaterB

Gast
> nur sobald ein Client verbunden ist, funktioniert das nicht mehr.

kannst du das näher definieren? was soll passieren/ was passiert stattdessen?
interrupt() hat sicherlich wenig Auswirkungen, würde laufende Client-Threads gar nicht betreffen,
aber System.exit(0) ist doch recht final

> Zudem scheint die Schleife für unnötige CPU Last zu sorgen. Teilweise nimmt die Anwendung dann 99% eines Kerns in Anspruch.

prüfe per Ausgabe in Zeile 15-17, ob die Schleife millionenmal durchlaufen wird, oder ob besser die ganze Zeit auf neue Eingaben gewartet wird,
was genau passiert, hängt natürlich von der jedermann unbekannten Klasse StdInput ab
 

vsk

Aktives Mitglied
kannst du das näher definieren? was soll passieren/ was passiert stattdessen?
interrupt() hat sicherlich wenig Auswirkungen, würde laufende Client-Threads gar nicht betreffen,
aber System.exit(0) ist doch recht final

Die Schleife:
[JAVA=15]while(!stopString.equals("H")){
stopString=StdInput.readString().toUpperCase().trim();
}
eineNachfolgendeMethode();
[/code]
soll dafuer sorgen, dass der Server ueber die Eingabe der Buchstaben "h" beendet werden kann.
Nachfolgende Methoden sollen erst dann ausgeführt werden.

Problem:
sobald ein Client am ServerSocket Verbunden hat, kann ich soviel "h"+ENTER eingeben wie ich will, das interresiert den Server dann nicht mehr.

Die Klasse StdInput beinhaltet einfach nur einen Buffer zum Einlesen der Tastatureingabe:
Java:
//StdInput.readString() fuehrt zu:
public static String readString()
 {
  BufferedReader br;
  String inputString = "";

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
   inputString = br.readLine();
  }
  catch(IOException _uh)
  {
   System.out.println("Lesefehler !");
  }
  return inputString;
 }

prüfe per Ausgabe in Zeile 15-17, ob die Schleife millionenmal durchlaufen wird, oder ob besser die ganze Zeit auf neue Eingaben gewartet wird

Die Schleife hält bei
[JAVA=16]stopString=StdInput.readString().toUpperCase().trim();[/code]
an, so wie ich mir das vorstelle. Ausgaben werden erst nach erfolgreicher Eingabe von "h" ausgegeben, vorausgesetzt kein Client ist verbunden, denn dann tritt ja das Problem auf...
 
S

SlaterB

Gast
ich kann es im Moment nicht testen und sehe direkt keine Ursache


allgemein ist es sehr gefährlich, bei jedem Lesevorgang einen neuen BufferedReader auf System.in zu legen,
wenn zu einem Zeitpunkt 10 Zeilen auf einmal vorhanden sind, dann liest ein BufferedReader alles in seinen großen Buffer/ Puffer
die erste Zeile davon wird zurückgegeben, der Rest geht für immer verloren, da der BufferedReader nicht wiederverwendet wird,

ein nächster readLine()-Aufruf schaut wieder auf die Eingabe

allgemein sowas wie new BufferedReader(new InputStreamReader(System.in)) immer nur genau einmal z.B. in einer statischen Variable definieren,
vielleicht hilft diese Änderung auch hier,
wobei ich mir aber bei einzelnen zeitlich getrennten Eingaben nicht so vorstellen kann, dass das zum Fehler führt,
zumal es auch anscheinend um die allererste Eingabe geht


bei
new BufferedReader(new InputStreamReader(mySocket.getInputStream()))
ist das ähnlich,
bisher ist es nur ein Lesevorgang, falls es aber mal mehrere werden, dann auf sowas achten,
übers Netzwerk können viel leichter mehrere Zeilen zusammen ankommen,
statische Variable fällt hier aus, Klassenattribut dann eher
 
Zuletzt bearbeitet von einem Moderator:

vsk

Aktives Mitglied
##EDIT### :autsch: ganz toll kompiliert und über konsole aufgerufen macht das programm fast was es soll, in der IDE netbeans dagegen tritt das beschriebene problem auf...

Es muss wohl die while-Schleife in der main sein.
Auch wenn ich es ohne einen BufferedReader mache gibt es Probleme.
Warum auch immer, jetzt kann auf einmal mehr kein Client connecten...
#EDIT# mit der while Schleife kommt er noch bis Zeile 27, aber schon nicht mehr zu Zeile 31..:autsch:
Java:
//imports gekuerzt
public class tcpServer extends Thread{
    static Vector ThreadVector = new Vector();
    static String stopString;
    static int port = 42420;

    public tcpServer(){

    }

    public static void main(String[] args) throws IOException {
        tcpServer myServer = new tcpServer();
        myServer.start(); //starten eines ThreadObjectes vom Typ tcpServer [main]
        boolean stopit=true;

        while (stopit){
            int c=0;
            c = System.in.read();
            System.out.println(c);
            if(c==120)// entspricht "x"
            stopit = false;
        }
    }

    @Override
    public void run(){
        System.out.println("Ich bin Thread: "+currentThread().getName()+" warte auf Clients");
        int i=0;
        try{
            ServerSocket myServerSocket = new ServerSocket(port);
            System.out.println(myServerSocket.getInetAddress());
          
            while(true){
                Socket aSocket = new Socket();
                aSocket = myServerSocket.accept();
                System.out.println("Ein Client ist da " +aSocket.toString());
                tcpServerThread aThread = new tcpServerThread(aSocket);
                synchronized(aThread){
                    ThreadVector.add(i, aThread);
                    allThreads();//gibt eine Liste aller Threads und deren Status aus
                    aThread.start();
                }
                i++;
            }
        }catch (Exception e){
                System.out.println(e);
            }
    }

    private void allThreads(){
        int size = tcpServer.ThreadVector.size();
            for (int i =0; i<=(size-1); i++){
                System.out.println(((Thread)tcpServer.ThreadVector.get(i)).getName() + 
" "+((Thread)tcpServer.ThreadVector.get(i)).getState());
            }
    }
}

irgendwie muss ich diese while schleife anders realisieren oder in die run() unterbringen... nur wie
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
hmm, das hatte ich zwischenzeitlich auch bei mir (deshalb schrieb ich erst, ich könne es nicht testen)
und konnte das noch weniger erklären,

mit
Thread.sleep(1000);
vor der Eingabe-Schleife gehts aber, warum auch immer..
 

vsk

Aktives Mitglied
oh man, da bin ich aber irgendwie froh, dass das nicht nur bei mir so ist!

:toll: Thread.sleep(1000);

jetzt muss ich wenigstens nicht immer zwischen Konsole und IDE hin und herwechseln.

Grosses DANKE @ SlaterB

damit hat sich das Thema erledigt
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Multithreaded-Server Netzwerkprogrammierung 21
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
B Multithreaded Server: Connection reset Netzwerkprogrammierung 4
T multithreaded multiport socketListener beendet TCP-Port-Listening Netzwerkprogrammierung 16
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
K C# Server - Android Client Netzwerkprogrammierung 0
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
F Verbindung zwischen Server und handy Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
R RMI Server RMI Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben