# Threads closen und Sockets schliessen



## Kayuke (26. Jan 2013)

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:






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 

```
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


----------



## Bizarrus (27. Jan 2013)

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?


```
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.


----------



## Kayuke (27. Jan 2013)

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.


----------



## Bizarrus (27. Jan 2013)

> Das Problem ist das es so wohl nicht geht bei Sockets.


ServerSocket (Java 2 Platform SE v1.4.2)

ServerSocket besitz aber definitiv eine close-Methode.



> Deshalb dachte ich mit currentThread().stop(); bzw. mit currentThread().close(); müsste der Thread noch geschlossen werden aber das bringts leider auch nicht.


Kann man überhaupt Thread schließen, wenn du mit "Thread" auch wirklich ein "Thread" meinst?


----------



## Kayuke (27. Jan 2013)

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


----------



## Bernd Hohmann (27. Jan 2013)

Kayuke hat gesagt.:


> 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


----------

