Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Chatproramm über Server(/Client-)Socket (https://www.delphipraxis.net/166706-chatproramm-ueber-server-client-socket.html)

CCl2224lCody 26. Feb 2012 10:41

Chatproramm über Server(/Client-)Socket
 
Hallolo zusammen..

Ich bin momentan an einem Schulprojekt für den Infounterricht beschäftigt:

Wir sollen ein Chatprogramm entwerfen..

Soweit so gut, es funktioniert im Standartmodus,
aber bei der Implementierung eines Extrafeatures reagiert Delphi so,
wie ich es nicht erklären kann.


Delphi-Quellcode:
procedure TServer.ssServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var Clantag : String;
    i : Integer;
begin
  Socket.ReceiveBuf(BuffRecord, SizeOf(BuffRecord));
  if BuffRecord.Typ = 'Online'         //Wenn Client connected, sendet dieser eine Onlinemeldung
     then begin                        //an den Server
            i := 0;
            while (i < lbClients.Items.Count) and (BuffRecord.Nickname <> lbClients.Items[i])
                  do Inc(i);           //Überprüfung, ob Nickname schon vorhanden ist
            if i = lbClients.Items.Count
               then begin              //Falls nein, Client hinzufügen und Änderung im Netzwerk machen
                      lbClients.Items.Append(BuffRecord.Nickname);
                      Clientliste_aktualisieren;
                    end
               else begin              //Falls ja, Nachricht an den Client vorbereiten
                      Buffrecord.Typ := 'Nachricht';
                      Buffrecord.Nickname := 'Server';
                      Buffrecord.Clantag := '';
                      Buffrecord.Text := 'Nickname "' + lbClients.Items[i]+ '" schon vorhanden!';
                      ssServer.Socket.Connections[ssServer.Socket.ActiveConnections-1].SendBuf(BuffRecord, SizeOf(BuffRecord));
                      ssServer.Socket.Connections[ssServer.Socket.ActiveConnections-1].Close;
              //        Socket.SendBuf(BuffRecord, SizeOf(BuffRecord));
              //        Socket.Close;   //Nachricht und Closebefehl senden
                    end;
          end


Und in den letzten zwei bzw vier Zeilen tritt das Problem auf:
Egal an welchen Connections-Index ich den Buf sende, es erhalten ihn alle Clienten (unabhängig ob dort "Connections[ActiveConnections-1", "lbClient.Items.Count" oder ein fester Wert (zB 1) eingetragen ist).
Wenn ich das Close rausnehme, erhält der neue, doppelte Client den Buf sogar zweimal.
Und auch bei Socket.SendBuf und Socket.Close geschied dasselbe, obwohl doch der Socket in der Prozedur eigentlich der sein müsste, von dem die doppelte Anmeldung ausgeht..

Achja, der Closebefehl erreicht immer den richtigen...


Kann mir einer da weiterhelfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz