Autor Beitrag
Ccenter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Fr 05.11.10 18:17 
Hi,
Angelehnt an den Thread www.c-sharp-forum.de...ewtopic.php?t=100704
habe ich nun vor, mein Programm wieder zu erweitern. Das Senden und Empfangen in einem Programm funktioniert ja bereits, allerdings nur mit einer Person. Im Prinzip warte ich auf einen Chatpartner, doch wenn wir verbunden sind kann sich kein weiterer Kumpel mit mir verbinden. Das würde ich gerne so ändern, dass beliebig viele sich mit mir verbinden können und ebend auch anders herum.
Ich denke mal, dass man irgendwie einen neuen TcpCLient/Listener starten muss, sobald einer verbunden wurde. Diesbezüglich brauche ich soetwas wie einen Tipp, Denkanstoß oder wie man das auch nennen möchte.
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Sa 06.11.10 10:31 
Leg ein Array vom Typ TcpClient an. dann starte den TcpListener und nimm die Verbindung immer mit einem nicht verbundenen TcpClient an. Den TcpListener brauchst du dabei nicht neu zu starten
also so
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for (i=0; i<TcpClientArray.Length; i++)
{
   if (!((TcpClientArray[i] == null) || TcpClientArray[i].Connected))
   {
       TcpClientArray[i] = Listener.AcceptTcpClient();
       Console.WriteLine("Neue Verbindung von {0}", TcpClientArray[i].Client.RemoteEndPoint);
   }
}
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 06.11.10 20:14 
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 user profile iconhuuuuuh 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:

ausblenden 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
Ccenter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Sa 13.11.10 22:05 
Ok, dafür schonmal Danke.
Allerdings kann ich mich noch nicht ganz so mit dem Gedanken anfreunden, zwei Programme gleichzeitig laufen zu lassen. Ich habe meinen Clienten jetzt soweit, dass wenn jemand neues sich in die Konferenz einklinkt, er anhand einer Zahl (z.B. 1) in einer Listbox erscheint. Das meißte müsste ab hier jetzt auch klappen =)
Eine Frage kommt mir aber gerade noch: Wenn ich jetzt jemanden privat anschreiben möchte, würde ich es gerne so machen, dass ich die Person dann einfach in der Listbox anklicke.
Dafür fehlt mir beim Sendvorgang aber eine Art If-Abfrage, welcher Listbox-Member gerade angeklickt ist, damit der Sender weiß an wen gesendet werden soll. Da bräuchte ich jetzt Hilfe :D
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 13.11.10 22:27 
user profile iconCcenter hat folgendes geschrieben Zum zitierten Posting springen:
Eine Frage kommt mir aber gerade noch: Wenn ich jetzt jemanden privat anschreiben möchte, würde ich es gerne so machen, dass ich die Person dann einfach in der Listbox anklicke.
Dafür fehlt mir beim Sendvorgang aber eine Art If-Abfrage, welcher Listbox-Member gerade angeklickt ist, damit der Sender weiß an wen gesendet werden soll. Da bräuchte ich jetzt Hilfe :D

Das kann ich dir nicht richtig beantworten, wenn ich nicht weiß, wie dein Programm arbeitet. Du sagst, es soll immer nur ein Programm gestartet werden müssen - dann läuft auf einem Rechner Server und Client in einem Programm. Hast du das wirklich in einem Endpunkt zusammengefasst? Dann kann eine Nachricht ja entweder für alle, für einen Client oder für den Server bestimmt sein.

Du müsstest auf jeden Fall zusätzlich zur Nachricht eben noch die ID des Benutzers mitschicken. Der Server entscheidet dann, an welche Mitglieder er die Nachricht weiterschicken soll und ob er sie selbst anzeigt.