Wegwerf Client

Loud Silence

Bekanntes Mitglied
Wie kann man verhindern, dass sich ein Client, nachdem er einen InputStream vom Server erhalten hat, gleich wieder schließt? Dass man also noch weiter Informationen an den Client schicken kann, ohne diesen wieder neu starten zu müssen.

Vielen Dank im Voraus
 
Zu beispiel mit einem Thread.

Java:
while(is not ende)

Ein Programm schließt sich immer dann, wenn er alle Operationen ausgeführt hat.
 
Diese Überlegung hatte ich auch schon angestellt.
Aber wann soll der Thread gestartet werden.
Der Client muss ja im Prinzip immer hören, ob da etwas ankommt.
 
Hier erst mal ein bisschen Quellcode:

Java:
import java.net.*;
import java.awt.Frame;
import java.io.*;
public class Client{
 
    
    Client() throws IOException {
        Socket server = new Socket ("localhost", 1234);
       ServerThread st = new ServerThread(server);
        st.start();
        server.close();
       br.close();
    }
 
        public static void main(String[] args) {
        	
            try{
                Client client = new Client();
            }catch (IOException e) {
                System.out.print(e);
                
    }
    
 
    }
 
}

Server Thread

Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
 
public class ServerThread extends Thread{
private Socket s;
public ServerThread(Socket server) {
this.s = server;
}
 
public void run(){
	
	
	try{
BufferedReader br = new BufferedReader(new InputStreamReader (s.getInputStream()));
int x = Integer.parseInt(br.readLine());
if (x == 1){
	System.out.println("Works");
}
	else{
		System.out.println("Wrong Int");
	}


//br.close();
	} catch(IOException e){
	System.out.println("Fehler");
}
}
}

Jetzt schließt sich der Client gleich nachdem ein Zahl vom Server empfangen wurde.
Wenn ich eine neue Zahl schicken will, muss ich den Client neu starten.
Das sollte nicht so sein.
Ich will also, dass er offen bleibt.
 
wenn du pro Client nur eine Verbindung zum Server brauchst, kannst du das auch ohne Threads machen. So z.B. (nicht getestet!):
Java:
public static void main(String[] args) {
   Socket s = new Socket ("localhost", 1234);
   BufferedReader br = new BufferedReader(new InputStreamReader (s.getInputStream()));

   String line;   
   while((line = br.readLine()) != null) {       	
      try{

         int x = Integer.parseInt(line);
         if (x == 1){
            System.out.println("Works");
         }
         else{
            System.out.println("Wrong Int");
         }

      }catch (IOException e) {
          System.out.print(e);

      }
   }
   br.close();
}

Damit liest du zeilenweise alles ein was der Server schickt und machst daraus ints.

Falls du was anderes tun willst, bitte mal genau schrittweise schreiben was wann wie passieren soll.
 
Also wenn deine Lösung verhindert, dass der Client einmal etwas entgegen nimmt und sich dann schließt, bin ich schon zufrieden.
Es soll einfach nur eine Zahl empfangen werden und diese aufschreiben.

Edit:
Ich denke nicht, dass es am Client liegt...
Aber was ist dann das Problem
Hier die Fehlermeldungen wenn ich versuch eine zweite Zahl abzusenden:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at KleinerServer$1.actionPerformed(KleinerServer.java:36)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Zuletzt bearbeitet:
Ich weiß jetzt nicht genau was du meinst.
Was heißt am Thread?

Vllt. sollte ich noch dazu sagen:
Wenn ich den Server offen lasse und den Client einfach immer wieder neustarte funktioniert alles einwandfrei.
Nur wenn der Client offen bleiben soll was er nicht tut) passiert das.
 
Zuletzt bearbeitet:
Code:
        st.start();

wird das am gleichen Objekt zwei mal aufgerufen?

Was genau passiert in dem Thread?
 
Du wirst dem Thread ja irgendwie sagen, dass er anfangen soll run() auszuführen.
Das kannst du mit Thread.run() machen oder mit Thread.start().
Du solltest aber, wenn du den parallel nutzen willst start() nutzen 🙂
 
Der Button startet den ServerThread:

Java:
public void actionPerformed( ActionEvent ae ) {
    	  st.start();
       
      }

ServerThread


Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
 
public class ServerThread extends Thread{
private Socket s;
public ServerThread(Socket client) {
this.s = client;
}
 
public void run(){

	
	
	try{
String str = "Hallo";
	BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write(KleinerServer.tf.getText());
out.newLine();
out.flush();

out.close();
	} catch(IOException e){
	System.out.println("Fehler");
}
}
}
 
Naja offensichtlich rifst du start() am gleichen Trhead auf und dann womöglich noch dann, wenn er bereits läuft ==> das ist "Illegal"
 
Es muss doch eine Möglichkeit geben den Client einfach offen zu halten.
Mehr brauch ich gar nicht.
Er darf sich bloß nur nicht nach einmaliger Verwendung gleich schließen.
 
es gibt mehr als genug Tutorials wo das Grundprinzip für Client-Server erklärt wird ... die gibt es in allen Sprachen - das Prinzip bleibt aber gleich
 
Oh, das hatte ich glatt vergessen.
Tut mir leid!
Und natürlich funktioniert er genau so wie ich es wollte.
Allerdings brauche ich gar nicht so viele Funktionen.
Ich habe versucht den Code runterzubrechen und habe mir die Class Client näher angeschaut.
Jedoch habe ich nicht den Knackpunkt gefunden der dafür sorgt dass sich der Client nicht schließt.
Wo finde ich den?
 
Zuletzt bearbeitet:
Naja, der "Trick" ist halt einfach, dass in der run-Methode des ClientReadingThreads, des ReceivingThreads und des "SendingThreads" eine (mehr oder weniger) Endlosschleife steht. Dadurch wird es möglich beliebig oft Daten zu senden und zu empfangen. Wenn du nicht verstehst wie der Programmcode von Michael funktioniert solltest du dir vielleicht nochmal ein gutes Java-Buch zu Hand nehmen und erstmal deine Grundlagenkenntnisse auf Vordermann bringen.
 
Der Knackpunkt ist das MultiThreading und die while Schleifen auf Client und Serverseite die solange auslesen, solange es etwas zu lesen gibt bzw. die Verbindung zwischen beiden offen ist.

Client und Server sind ziemlich ähnlich aufgebaut. Sobald eine Verbindung aufgebaut ist, wird das Socket (man könnte auch direkt den InputStream nehmen) an ein Runnable Objekt übergeben. Dieses "startet" sich selbst in einem separaten Thread, in dem dann vom InputStream gelesen wird.
Der zusätzliche Thread (ist im Nachhinein eigentlich überflüssig) im ReadingThread des Clients dient nur zur Demo, um von der Konsole zu lesen. Genauso gut könnte man eine GUI verwenden, um dann per Listener die sendMessage() des Clients aufzurufen und einen String an den Server zu übertragen.
 

Neue Themen


Zurück
Oben