# Threads auflisten und nacheinander ansprechen



## Alyra (29. Mrz 2011)

Guten Morgen,

ich bin dabei, ein Spiel zu entwickeln, dass auch über Netzwerk laufen soll. Leider sind meine Networking-Kenntnisse noch recht gering, weshalb ich ein wenig Hilfe benötige.

Ich habe eine Server-Klasse erstellt, auf der die gesammte Spielmechanik läuft. Der Server öffnet einen Socket, zu dem andere Rechner aus dem Netzwerk connecten können. Für jeden verbundenen Spieler wird ein eigener Thread erstellt, sodass mehr als nur ein Client auf den Socket verbinden kann. Nun soll der Server ab Spielbeginn immer einem Clienten ein Signal senden, dass er nun am Zug ist. Natürlich soll es immer die selbe Reihenfolge haben, erst kommt Spieler 1 dran, dann Spieler 2, dann 3 und dann wieder 1. 

Ist es irgendwie möglich, die Threads in eine Art Array zusammenzufassen und dann erst dem ersten Client das Signal zu geben, dass er am Zug ist, danach den Spielzug durchführt und dan dem 2. Spieler das Signal zu senden? Wenn ja, kann mir jemand erklären wie das geht?

Liebe Grüße


----------



## SlaterB (29. Mrz 2011)

das ist nicht anders als alles andere was erklärt werden muss, 
wenn du drei ints addieren willst, dann erst a + b, danach + c

hier musst du beim Aufbau der Verbindung das Thread-Objekt oder etwas vergleichbares in ein/e Array/Liste speichern,
später auf dieses zugreifen, der Reihe nach durcharbeiten, mit jedem Client so kommunizieren wie es eben gerade richtig ist,
solange wartet der Server oder was immer angebracht ist

das sind aufgezählte Normalitäten weil die Frage an sich nichts bestimmtes beinhaltet, sicherlich sind letztlich hunderte Zeilen Code nötig, aber hier können ja nicht alle Details des kompletten Spiels aufgezählt werden,
was ist deine konkrete Frage? die Clients werden durch irgendein Objekt repräsentiert, dieses kommt sortiert in eine Liste, fertig

wie man generell mit einem einzelnen Client kommuniziert und was der Rest solange macht, wäre schon wieder ein ganz anderes Thema


----------



## Alyra (29. Mrz 2011)

Ich denke, letzteres ist so meine frage. Wie kann der Host einem einzenlnen Thread kommunizieren und danach mit dem nächsten Thread...


----------



## SlaterB (29. Mrz 2011)

auch wieder: wie nicht?
eine absolute Grundlagenfrage, A sendet an B, wartet auf Antwort, Antwort kommt, fertig

hast du je von einem Server an einen beliebigen einzelnen Client irgendetwas gesendet und dieser nach etwas Zeit irgendwas zurück?
was ist hier anders, wo liegt ein Problem vor?


```
List<ClientHandler> list = ..;
for (ClientHandler c : list) {
  c.sende("du bist dran "+aktuellerProgrammzustand());
  String antwort = c.warteAufAntwort();
  verarbeiteZug(c, antwort);
  // fertig für dieses c, nächster in der Schleife ist dran
}
```
je nach Beliebigkeit kann man es komplizierter machen, 
z.B. nach jeder Client-Aktion an alle eine Info mit den aktuellen Änderungen schicken + Info wer gerade dran ist


----------



## Alyra (29. Mrz 2011)

okay, das ist schonmal sehr verständlich, danke^_^

Ich hab jetzt in der Host-Klasse eine Liste erstellt:


```
List<MonopolyThread> spielerListe;
```

weiter unten habe ich dich methode "verbinden", die so aussieht:


```
public void verbinden ()
    {
    	while (true)
    	{
    		try
    		{
    			System.out.println("Verbinden...");
    			
    			socket = server.accept();
    			thread = new MonopolyThread(socket);
    			thread.start();
    			spielerListe.add(thread);
    			System.out.println("Verbunden mit " + socket);
    		}
    		catch (IOException e)
    		{
    			System.out.println("Serverfehler " + e);
    		}
    	}
    }
```

Und weiter unten dann noch eine for-Schleife, die im Grunde das macht was du im letzten Post geschrieben hast. Müsste so stimmen, oder?


----------



## SlaterB (29. Mrz 2011)

wenn du es so hast wie ich es geschrieben habe muss es natürlich stimmen, klar 

naja, mit 5 Zeilen ist noch nicht viel Land gewonnen, das hilft ein bisschen aber muss nicht für alle Programme das richtige sein


----------



## Alyra (29. Mrz 2011)

Es hat mir auf jeden Fall weitergeholfen, dankeschön.


----------

