tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
403
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    skee skee ist offline Mitglied Silber
    Registriert seit
    Oct 2003
    Beiträge
    55
    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
     

  2. #2
    Avatar von Chefkoch333
    Chefkoch333 Chefkoch333 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    112
    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();
                }
            }
        }
    }
     

  3. #3
    skee skee ist offline Mitglied Silber
    Registriert seit
    Oct 2003
    Beiträge
    55
    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
     

  4. #4
    Avatar von Chefkoch333
    Chefkoch333 Chefkoch333 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    112
    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.
     

  5. #5
    skee skee ist offline Mitglied Silber
    Registriert seit
    Oct 2003
    Beiträge
    55
    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
     

  6. #6
    fassy fassy ist offline Mitglied Bronze
    Registriert seit
    Jan 2010
    Beiträge
    42
    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

  1. Kommunikation zwischen Klassen/Objekten
    Von floggie im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 6
    Letzter Beitrag: 24.03.06, 14:32
  2. Antworten: 9
    Letzter Beitrag: 05.10.05, 09:26
  3. Kommunikation zwischen Klassen
    Von hbrauchl im Forum Visual Basic 6.0
    Antworten: 5
    Letzter Beitrag: 04.07.05, 13:01
  4. Übrgabe von Strings zwischen Klassen
    Von ladodo im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 03.11.04, 19:55
  5. Daten zwischen Klassen
    Von Tentoxa im Forum Java
    Antworten: 4
    Letzter Beitrag: 30.09.04, 14:24