Zugriff auf Variable in anderem Thread

Status
Nicht offen für weitere Antworten.

sczakiju

Mitglied
Hallo 🙂

Ich bin Java Einsteiger und möchte dennoch RemoteControl System in Java realisieren. Nun habe ich da noch ein paar Probleme. Also die Grundstruktur sieht folgendermaßen aus:

- Server der auf Port x auf Verbindungen wartet
- Server der auf Port y auf Verbindungen wartet

- Threads die Verbindungen auf Port x verwalten und mit dem Client kommunizieren
- Threads die Verbindungen auf Port y verwalten und mit dem Browser kommunizieren (eine Weboberfläche mit kleinem Java Webserver (Also der einfach Pakete im http abschickt)

So nun würde ich gerne in dem Thread für die Weboberfläche die verbunden Clients ausgeben, also brauche ich irgendwie eine Liste oder sowas in dem Thread für die Clients, der den Hostname der Clients ausliest. Okay das sollte machbar sein, nur wie kann ich auf diese Variable zugreifen? Und worin soll ich die Clients abspeichern? Vorschlag von einem Freund war in einer HashMap aber ich habe keine Ahnung wie ich das machen soll... :bahnhof:

Danke schonmal für eure Hilfe 🙂
 
Also ich schätze nicht , dass dir hier jemand eine HashMap mit irgenwelchen variablen programmiert.

Da wird lediglich der Verweis auf ein gutes Buch kommen , wie von mir:

Schau dir die java FAQ's im Forum an und such dir dass passende raus.
Open books

Schau dir mal was an und poste dann deine konkreten probleme, gruss
 
Hallo Spin und Danke für deine Antwort.

Ich hab natürlich nicht erwartet, dass mir jemand hier was fertiges programmiert 😉
Also das konkrete Problem ist eigentlich auch eher bei mir, in was für einem Typ Variable (HashMap war nur ein Vorschlag von einem Freund aber ich weiß ja nicht was ihr meint) ich die verbundenen Clients abspeichern sollte.
Also sagen wir mal ich möchte nachher eine Liste mit Hostnamen haben die verbunden sind. Also der Client schickt seinen Namen an den Server nur in welchem Typ Variable speicher ich das am besten? Natürlich muss der User da auch wieder raus aus dieser Liste, wenn er die Verbindung trennt.
Gruß sczakiju
 
Du könntest von den die ankommenden Clients die Socket Objekte die der Server mittels der
Java:
 accept()
Methode an die Threads weitergibt vorher benutzen um den Namen abzufragen.

Java:
...
Socket client = serverSocket.accept() 
...
String hostname = client.getInetAddress().getHostName(); 
...

Den Namen mit dem Socket kannst du dann in einer
Java:
Map<String,Socket>
speichern.
Diese Map könne in einem Singelton gekapselt werden damit sie von allen Threads zugänglich ist, für das hinzufügen neuer Clients und das löschen.
Aus Gründen der threadsicherheit rate ich zu einer ConcurrentHashMap.
 
Danke für deine Antwort!

Genau so ähnlich habe ich das schon. Moment hier mal die Codeausschnitte

CServerThread:

Java:
while (true)
			{
				// Eingehende Client-Verbindungen aktzeptieren
				ClientConnection = ServerSocket.accept();
				// ClientID MD5 Hash erzeugen
				ClientID = CMD5.MD5(System.nanoTime() + "");
				// Neuen ConnectionThread aufrufen und ClientID (,den Socket und eigenen Thread) übergeben
				CConnectionThread ConnectionThread = new CConnectionThread(ClientConnection, ClientID, this);
				// Speichere Client in Hashmap
				Clients.put(ClientID, ConnectionThread);
				// ConnectionThread starten
				ConnectionThread.run();
			}
Nun weiß ich leider nicht genau, wie ich auf die Variable zugreife bzw. wie ich sie am besten verändere. Könntest du mir das mit dem Singleton und der ConcurrentHashMap noch einmal erklären?
Gruß sczakiju
 
Zum Thema Singelton siehe Wikipedia.

Der Aufbau wäre dann wie folgt:
Java:
public class VerbundeneClients {
	
	/** aktuelle und einzige Instanz des Objektes.  */
	private static final VerbundeneClients aktInstanz = new VerbundeneClients();
	
	/** Map mit den Verbundenen Clients. */
	private final Map<Socket, String> verbundeneClients;
	
	/**privater Konstruktor Verhindert das mehrmalige Instanzieren */
	private VerbundeneClients () {
		this.verbundeneClients = new ConcurrentHashMap<Socket, String>();
	}
	
	/** Zugriff af die einzieg Vorhandene Instanz beschaffen. */
	public static final VerbundeneClients getInstance() {
		return aktInstanz;
	}
	
	public void neueVerbindung(final Socket ClientSocket, final String name) {
		//hinzufuegen zur Map
	}
	
	public void clientVerbindungBeendet(final Socket clientSocket) {
		//entfernen aus der Map
	}	
}

Zugriff darauf hast du mit VerbundeneClients.getInstance(), dann kannst du die nötigen Methoden aufrufen die du brauchst.

Ein Hinweis noch, nicht ConnectionThread.run(); sondern ConnectionThread.start() benutzen.
 
Danke 🙂 Das hat mir schonmal sehr geholfen 🙂
Ich werd das heute Abend mal testen und gebe dann nochmal ne Rückmeldung
Gruß sczakiju
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben