ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
403
403
EMPFEHLEN
-
Hallo,
ich muss vorrausschicken, dass ich noch recht neu in Java bin und ich evtl was ganz einfach frage. Aber ich bin mit der Terminologie noch nicht vertraut, deswegen finde ich evtl beim googeln nix
Folgendes:
Ich habe mir für ein Multipülayer-Spiel ein Script eines Thread-fähigen Socketservers aus dem Netz gezogen. Ich verstehe es zu einem großen Teil und er funktioniert auch bis zu einem gewissen Grad so wie ich es will.
Code sieht so aus:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.io.BufferedReader; import java.util.*; public class ChatServer { public static final int DEFAULT_PORT = 9800; public static void main(String[] args) { int port = DEFAULT_PORT; ServerSocket serverSocket = null; Socket socket = null; try { if (args.length > 0) port = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { System.err.println("Usage: java ChatServer [port]"); System.err.println("Where options include:"); System.err.println("\tport the port on which to listen."); System.exit(0); } try { serverSocket = new ServerSocket(port); while (true) { socket = serverSocket.accept(); System.out.println("Client registriert"+socket); ChatHandler handler = new ChatHandler(socket); handler.start(); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { serverSocket.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } }
Im instanzierten ChatHandler speichere/verarbeite ich die ganzen spielerbezogenen Daten und das funktioniert super.
Jetzt habe ich aber das Problem, dass ich ja Variablen/Hashmaps brauche, in denen ich "globale" Infos speichern muss. zB welcher Spieler an welchem Thread hängt, oder wieviele/welche Spieler sich auf bestimmten Karten rumtreiben, etc
Was muss ich jetzt hier im ChatServer machen, damit ich variablen habe, auf die die einzelnen Threads zugreifen dürfen? Und wie greife ich dann auf diese zu.
Wär super, wenn mir jemand helfen könnte.
Danke
Skee
-
15.01.10 13:44 #2
am einfachsten wäre eine hashmap zu verwenden. In deinem Beispiel müsste es dann so aussehen:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.io.BufferedReader; import java.util.*; public class ChatServer { public static final int DEFAULT_PORT = 9800; private static Map registry = new HashMap(); public static void main(String[] args) { int port = DEFAULT_PORT; ServerSocket serverSocket = null; Socket socket = null; registry.put("foo", "bar"); // fügt eine variable hinzu try { if (args.length > 0) port = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { System.err.println("Usage: java ChatServer [port]"); System.err.println("Where options include:"); System.err.println("\tport the port on which to listen."); System.exit(0); } try { serverSocket = new ServerSocket(port); while (true) { System.out.println(registry.get("foo")); // holt die variable socket = serverSocket.accept(); System.out.println("Client registriert"+socket); ChatHandler handler = new ChatHandler(socket); handler.start(); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { serverSocket.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } }
-
Habe ich dann "aus den Threads heraus" auch die Möglichkeit auf diese Hashmap zuzugreifen?
Mein "Problem" ist, dass ich zu dem Zeitpunkt, an dem die Verbindung zustande kommt, und der Thread gestartet wird, noch nicht weiss, wer an diesem Thread hängt. Der muss sich erst authentifizieren und dann habe ich diese info. Ich müsste also, aus dem Thread heraus diese Info zentral ablegen können.
Skee
-
15.01.10 14:22 #4
Ah ok, in diesem Fall solltest du die Map in deinem ChatHandler hinzufügen. Allerdings nicht als static member. So hast du diese automatisch im richtigen Thread und eindeutig deiner ClientConnection zugeordnet.
-
Ich habe mich wohl nicht ganz korrekt ausgedrückt, oder ich verstehe deine Hilfe noch nicht ganz
Ich versuche es nochmal
Die Hashmap registry müsste irgendwo zentral liegen und eben nicht in jedem ChatHandler. Ich möchte zB, dass der Spieler xxx an "Thread10" eine Nachricht an Spieler yyy an "Thread28" schicken kann. Da müsste doch, nach meinem verständniss, der Thread10 irgendwie eine Möglichkeit haben in einer zentralen Hashmap zu gucken, dass Spieler yy eben an Thread28 hängt um dort eine nachricht abzusetzen.
Und, ein neu hinzugekommener Spieler sollte eben nach erfolgreicher Authentifizierung die möglichkeit haben, in diese Hashmap einzutragen "Spieler 0815 hängt an Thread0815"
Skee
-
Erstellst dir am besten ein Singelton
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public class Registry{ private Registry instance; private Map<Client,Thread> internalRegistry; private Registry(){ internalRegistry = new HasMap<Client,Thread>(); } public static Registry getInstance(){ if(instance == null){ instance = new Registry(); } return instance; } public void addClient(Client c, Thread t){ // Client registrieren und handlend wenn key in der map vorhanden } public Thread getClientThread(Client c){ return internalRegistry.get(c); } }
Über getInstance() bekommst du dann in jeder Klasse die Registry und kannst da information holen oder ablegen.
Viele Grüße
f.
Ähnliche Themen
-
Kommunikation zwischen Klassen/Objekten
Von floggie im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 6Letzter Beitrag: 24.03.06, 14:32 -
Variablen zwischen zwei Klassen austauschen
Von FJK im Forum C/C++Antworten: 9Letzter Beitrag: 05.10.05, 09:26 -
Kommunikation zwischen Klassen
Von hbrauchl im Forum Visual Basic 6.0Antworten: 5Letzter Beitrag: 04.07.05, 13:01 -
Übrgabe von Strings zwischen Klassen
Von ladodo im Forum VisualStudio & MFCAntworten: 3Letzter Beitrag: 03.11.04, 19:55 -
Daten zwischen Klassen
Von Tentoxa im Forum JavaAntworten: 4Letzter Beitrag: 30.09.04, 14:24





Zitieren
Login





