Multi Session Chat
-
Hi, wollte mal nachhaken ob dieser Weg sinnvoll ist wenn man einen Chat mit einer unbegrenzten Teilnehmeranzahl programmiert.
Connections[i] ist ein Array aller aktiven Verbindungen, bei 0 beginnend.
for (i = 0;i <= max;i++) //Weiterleitung an alle verbundenen Clients { ServerSocket1->Socket->Connections[i]->SendText(v); }Was passier wenn bei 10 Verbindungen der 7. disconnectet, wird dann das Array durch den disconnect neu sortiert oder entstehen lücken im Array? Da ich von Multithreading keine Ahnung habe und auch die Suche nach Multithreading in diesem Forum nirgendwo in verständlichem Deutsch zu finden war, habe ich mir mal so aus dem Bauch heraus geholfen:
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Key == VK_RETURN) { if (Edit1->Text != "") { if (isserver == true && Label1->Caption != 0) { for (i = 0;i <= max;i++) //Weiterleitung an alle verbundenen Clients { ServerSocket1->Socket->Connections[i]->SendText(name + " " +Edit1->Text); } Memo2->Lines->Add(name + " " +Edit1->Text); } else { if (ClientSocket1->Active) ClientSocket1->Socket->SendText(name + " " +Edit1->Text); } Edit1->Text = ""; } } } //---------------------------------------------------------------- void __fastcall TForm1::ServerSocket1Accept(TObject *Sender, TCustomWinSocket *Socket) { isserver = true; Memo2->Lines->Add("Neuer Client: "+Socket->RemoteAddress); max++; // Zähler für verbunden Clients (initialisiert bei -1 da erste Verbindung 0). } //----------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { max--; // Zähler für verbunden Clients. } //------------------------------------------------------------------Ist es sinnvoll oder nicht ? Habe es mit 3 Clients getestet und habe immer einen anderen Client disconnected und habe soweit noch keine Fehler gefunden.
Bin euch wie immer für jeden Beitrag sehr sehr dankbar
-
Solange du keine Features wie private Chats benötigst reicht das völlig aus.
Ansonsten brauchst du halt eine Benutzerverwaltung. Im einfachsten Fall wäre das eine Liste, in die du beim OnConnect den Nickname und den Index der Verbindung im Connections-Array einträgst.
Im OnDisconnect löschst du den entsprechenden Eintrag und passt ggf. die Index-Nummern der verbleibenden Verbindungen an. Wenn die siebente von zehn Verbindungen getrennt wird dann rutschen die letzten drei Verbindungen im Array eins nach unten, dem musst du in deiner Liste Rechnung tragen.
-
Vielen Dank Jansen

die Benutzerverwaltung wäre der nächste Schritt gewesen. Ich arbeite mal deine Erklärung durch.
Gruss David
-
Hallo,
mit
if(ServerSocket1->Socket->Connections[i]->Connected) {...}[cpp]
kannst du vor dem Senden jeweils prüfen, ob die Gegenstelle noch vorhanden ist...
Gruß
Timmy
-
Thx ! sieht mit deinem beispiel in kombination wesentlich sauberer aus und man riskiert kein "Index out of bound(x)"

Gruss David