Variablen zwischen Klassen

skee

Mitglied
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:
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
 
am einfachsten wäre eine hashmap zu verwenden. In deinem Beispiel müsste es dann so aussehen:
Java:
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
 
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 :D

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

Java:
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.
 
Zurück