Halli Hallo =)
Bin zurzeit ein kleinen Chat am Programmieren, alles super toll =)
Ich bin aber leider auf einem Problem gestoßen:
Da alle Daten via Syncronisize vom Server an alle Clients weitergeleitet werden, gibt es hierbei das Problem, das diverse Aktionen bei anderen Clients ausgeführt werden, die garnicht gewollt sind.
Beispiel das "Einloggen".
Der Client sendet zum Server den String "l\0Nickname\0Passwort\0Channel".
Der Server überprüft nun in der Datenbank ob der angegebene Benutzername existiert, und sendet dann zum Clienten "l\0true" bzw "l\0false".
Und hierbei entsteht das Problem:
Da der Server l\0true an alle Clients sendet, führen diese alle weitere aktionen durch.
Meine Lösung wäre nun, den Server etwas umzuorganisieren, das solche aktivitäten nicht via Syncronisize durchgeführt werden.
Jezt habe ich aber leider keine Wirkliche Idee, wie ich dies löse.
Die Clients werden in einer Hashtable gestored, der Server sendet dann durch folgende Methode die Nachrichten zu allen Clients:
Wie schreibe ich nun eine weitere Methode, ohne Syncronisation, der aber eine Nachricht nur an einem bestimmten Client gesendet wird?
Ein Client wird folgendermaßen in der Hashtable gestored:
Ich danke euch, für Hilfreiche Tipps und Tricks.
Mfg
Bizzi
Bin zurzeit ein kleinen Chat am Programmieren, alles super toll =)
Ich bin aber leider auf einem Problem gestoßen:
Da alle Daten via Syncronisize vom Server an alle Clients weitergeleitet werden, gibt es hierbei das Problem, das diverse Aktionen bei anderen Clients ausgeführt werden, die garnicht gewollt sind.
Beispiel das "Einloggen".
Der Client sendet zum Server den String "l\0Nickname\0Passwort\0Channel".
Der Server überprüft nun in der Datenbank ob der angegebene Benutzername existiert, und sendet dann zum Clienten "l\0true" bzw "l\0false".
Und hierbei entsteht das Problem:
Da der Server l\0true an alle Clients sendet, führen diese alle weitere aktionen durch.
Meine Lösung wäre nun, den Server etwas umzuorganisieren, das solche aktivitäten nicht via Syncronisize durchgeführt werden.
Jezt habe ich aber leider keine Wirkliche Idee, wie ich dies löse.
Die Clients werden in einer Hashtable gestored, der Server sendet dann durch folgende Methode die Nachrichten zu allen Clients:
Java:
private Hashtable client_table = new Hashtable();
[...]
Enumeration getOutputStreams() {
return client_table.elements();
}
void sendToAll(String message) {
synchronized(client_table) {
for(Enumeration e = getOutputStreams(); e.hasMoreElements();) {
DataOutputStream connection_output = (DataOutputStream)e.nextElement();
try {
connection_output.writeUTF(message);
} catch(IOException ie) {
/* Do Nothing */
}
}
}
}
Wie schreibe ich nun eine weitere Methode, ohne Syncronisation, der aber eine Nachricht nur an einem bestimmten Client gesendet wird?
Ein Client wird folgendermaßen in der Hashtable gestored:
Java:
Socket client = server.accept();
System.out.println("c\\0new");
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
client_table.put(client, dout);
Ich danke euch, für Hilfreiche Tipps und Tricks.
Mfg
Bizzi