Threads closen und Sockets schliessen

Kayuke

Mitglied
Huhu,
mein Spiel läuft jetzt ganz ordentlich und fast alles Bugs sind behoben 🙂

Nun hätte ich nur noch eine Frage zum Thema Threads Closen und Sockets schliessen.
Erstmal die Ausgangssituation, ich habe eine Klasse MultiPlayerPanel, worin 3 Buttons sind, einmal "Create", einmal "Join" und wenn eine Verbindung besteht erscheint ein 3ter Button mit "Start Game", nun wenn man auf Create klickt wird eine neue Instanz der Klasse Server erstellt in einer eigenen Instanz. Anschließend kann ein anderer Spieler auf Join klicken, die IP eingeben und dann wird eine Instanz der Klasse Client erstellt, ebenfalls in einem eigenem Thread.

Hier eine Skizze, falls das oben nicht verständlich war:
qohua3z9dx2e.png


Nun die Frage, wie "close" ich anständig die Threads und den Server und die Verbindung des Clienten damit ich z.B. wieder den Port freigebe und einen neuen Server erstellen kann?

Meine Überlegung war:
In den Klassen Server und Client eine Methode close() wo drin steht
Java:
server.close(); // bzw. beim beim Clienten client.close();
currentThread().close();
und im MultiPlayerPanel Server = null und Client = null.

Er schmeisst mir aber leider direkt eine Exception beim server.close(); :
"Exception in thread "Thread-3" java.lang.NullPointerException" und zeigt mir genau die "server.close();" zeile an.

Und bei currentThread().close() oder auch currentThread.stop() wird das close bzw. stop durchgestrichen angezeigt, vlt soll mir das auch etwas sagen das es so nicht geht 😛
 
Zuletzt bearbeitet:
Prüf doch einfach ob die Variable halt null ist. Denn wenn diese null ist, kann diese eh nicht geschlossen werden - Wo liegt da nun das Problem?

Java:
if(server != null) {
server.close();
}

Und bei currentThread().close() oder auch currentThread.stop() wird das close bzw. stop durchgestrichen angezeigt, vlt soll mir das auch etwas sagen das es so nicht geht 😛

Da wäre die Frage, was currentThread für eine Methode ist, und was diese returnt und ob das returnte Objekt überhaupt close() als Methode kennt.
 
Das Problem ist das es so wohl nicht geht bei Sockets.

Ich hab das so schon jetzt mehrfach probiert, also ich erstelle einen Server, rufe dann server.close() auf doch wenn ich dann wieder nen Server erstellen will sagt er mir der Port sei besetzt.

currentThread() ist eine vorgegebene Methode:
Returns a reference to the currently executing thread object.
Returns:
the currently executing thread.


Deshalb dachte ich mit currentThread().stop(); bzw. mit currentThread().close(); müsste der Thread noch geschlossen werden aber das bringts leider auch nicht.
 
Die Methoden sind alle vorhanden, würde schon sehen wenns net so wäre daher klar hat die ServerSocket ne close methode.

Und jop es ist ein richtiger Thread, der wird extra genutzt für den Server damit der Server im Hintergrund die ganze Zeit die Daten austauscht. Ich probier einfach mal weiter rum 😛
 
Nun die Frage, wie "close" ich anständig die Threads und den Server und die Verbindung des Clienten damit ich z.B. wieder den Port freigebe und einen neuen Server erstellen kann?

Threads "schliessen" sich dadurch, dass sie aus "run()" herausfallen.

Was die Sockets angeht: der Client sollte eine "Quit" Message senden, die der Server mit einem "OK" beantwortet. Danach können beide Seiten ihren Socket zumachen und mit einem netten "return;" aus "run()" verschwinden.

Ansonsten hast Du das beiderseitige Problem, dass Du halt die Exceptions der Sockets bzw. deren Streams abhandeln musst (die bei Dir vermutlich auch in einem .close() und herausfallen aus run() hinauslaufen).

Weiter ist da nichts zu machen.

Bernd
 

Zurück
Oben