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.
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.
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.
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)
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.
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
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 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.
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?
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.