Hallo,
hast du damals meinen Code in etwa übernommen oder sieht dein Programm anders aus als mein Vorschlag?
Mein Programm hat in dieser Hinsicht einen entscheidenden Nachteil: Server und Client sind beide abgeleitet vom Typ
ChatMember. Das bedeutet, dass Client und Server in etwa gleichwertig, auf jeden Fall ähnliche Teilnehmer sind. Wenn allerdings mehrere Clients mit einem Server verbunden sind, wird's kompliziert: Der Server hat nun plötzlich viel mehr zu tun als die Clients, weil er die Nachrichten aller Clients an die anderen weiterleiten muss.
Hier würde ich ein anderes Konzept vorschlagen: Der Server soll selbst kein aktives Mitglied sein, sondern nur die Verwaltung übernehmen. Wir haben so viele Clients wie Chat-Mitglieder, und jeder Client verbindet sich mit diesem Server. Der wiederum empfängt die Nachrichten aller Clients und leitet sie weiter.
Als erstes muss also das Programm in zwei Teile aufgespalten werden. Der Client kann in etwa so bleiben wie er ist, nur die Möglichkeit, als Server zu arbeiten muss entfernt werden.
Der Server ist komplizierter. Du brauchst, wie
huuuuuh geschrieben hat, nur einen
TcpListener, der auch nur einmal gestartet werden muss. Am Anfang der Methode
tcpClientAccepted muss jedoch schon auf den nächsten Client wieder gewartet werden:
C#-Quelltext
1: 2: 3: 4: 5:
| private void tcpClientAccepted(IAsyncResult target) { listener.BeginAcceptTcpClient(new AsyncCallback(tcpClientAccepted), null);
} |
Jedes Mal, wenn diese Methode aufgerufen wird, muss der empfangene Client in eine Liste geschrieben werden. In der Programmschleife musst du nun ständig prüfen, ob ein Client eine Nachricht gesendet hat (
TcpClient.Available > 0) und wenn ja, diese an alle Clients aus der Liste senden.
Außerdem muss ein Client aus der Liste entfernt werden, wenn er die Verbindung getrennt hat.
Als Erweiterung wäre noch denkbar, dass sich die Clients einen Namen geben können, der dann vor jede Nachricht geschrieben wird.
Grüße,
Yogu