Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ServerSocket: ActiveConnections stimmt nicht immer (https://www.delphipraxis.net/85779-serversocket-activeconnections-stimmt-nicht-immer.html)

Helmi 4. Feb 2007 19:16


ServerSocket: ActiveConnections stimmt nicht immer
 
Hallo Jungs,

ich muss ein leidiges Thema über ServerSocket ansprechen, dass ich mal wieder hab:

Ich hab zwei Programme vor 2 Jahren geschrieben, die mit ServerSocket und ClientSocket miteinander kommunizieren.
Funktioniert bestens - ehrlich!

Nur hab ich mir mal eine ComboBox einfallen lassen, in der die aktuellen Clients aufgelistet werden.
(Man kann dort was auswählen - aber dies ist nicht interessant für dieses Problem).

Um festzustellen, wieviele Einträge in der ComboBox vorhanden sein müssen, wird in einem Timer geprüft, wieviele Verbindungen vorhanden sind (ServerSocket.ActiveConnections).
Auch das funktioniert - ehrlich!

Nur leider stimmt die Anzahl der ActiveConnections nicht immer - ehrlich!

Ich weiss, dass es nur einen Client gibt - nur manchmal werden mir 2 Clients oder mehr angezeigt.

Weiss jemand an was das liegen könnte?

Zacherl 4. Feb 2007 19:26

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Wo fragst du die Eigenschaft ab? Im OnDisconnect? Wenn ja ist der grade disconnectete Client immer noch in der Liste .. dh du musst einen abziehen.

Helmi 4. Feb 2007 19:45

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Hallo,

Abgefragt wird in einem Timer:
Delphi-Quellcode:
procedure TMainForm.Timer_ConnectionTimer(Sender: TObject);
var
  Anzahl_Verbindungen: Integer;

begin
  //Timer disablen
  Timer_Connection.Enabled := false;

  //Variable beschreiben
  Anzahl_Verbindungen := ServerSocket.Socket.ActiveConnections;

  //Ist aktuelle Anzahl ungleich der alten Anzahl...?
  If (Anzahl_Verbindungen <> alte_Anzahl_Verbindungen) then
    begin
      //Label beschreiben
      Label_Anzahl_Verbindungen.Caption := IntToStr(Anzahl_Verbindungen);

      //Listbox leeren
      ListView_Client_Dateien.Clear;

      //Label leeren
      Label_Client_IP.Caption  := '';

      //ComboBox-Einträge aufbauen
      ComboBox_schreiben(Default_Client_S, false);

      //ausgewählten Client zurücksetzen
      ausgewaehlter_Client := -1;

      If Anzahl_Verbindungen = 0 then
        begin
          //enablen
          EnDisableComponents(true);

          //Timer disablen
          Timer_Ueberwachung.Enabled   := false;

          //Label beschreiben
          Label_Verbindung_Info.Caption := 'keine Verbindung vorhanden!';
        end
      else
        begin
          //Label beschreiben
          Label_Verbindung_Info.Caption := 'Verbindung wurde aufgebaut!';
        end;

      //Variable beschreiben
      alte_Anzahl_Verbindungen := Anzahl_Verbindungen;
    end;

  //Timer enablen
  Timer_Connection.Enabled := true;
end;
Der Timer läuft immer.

in OnDisconnect konnte ich es damals nicht machen, da OnDisconnect - sofern ich es noch im Kopf habe - nur ausgelöst wird, wenn kein Client mehr verbunden ist - sind es aber mehrere Clients, von denen sich einer abmeldet - wird onDisconnect nicht ausgelöst

Zacherl 4. Feb 2007 19:57

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Doch sowohl OnConnect als auch OnDisconnect wird für jeden Client ausgelöst. Insofern kannst du die ActiveConnections Eigenschaft immer dort abfragen, wobei du im OnDisconnect halt einen Client abziehen musst.

Helmi 4. Feb 2007 20:09

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Sei´s wie´s mag!
Unabhängig ob jetzt das in OnConnect, bzw. im OnDisConnect passiert, wird im Timer, der ja immer läuft, ActiveConnections ständig abgefragt - das heisst aber auch, dass die Anzahl der Verbindungen im ActiveConnections falsch ist

Helmi 4. Feb 2007 20:16

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Zitat:

Zitat von Florian Bernd
Doch sowohl OnConnect als auch OnDisconnect wird für jeden Client ausgelöst. Insofern kannst du die ActiveConnections Eigenschaft immer dort abfragen, wobei du im OnDisconnect halt einen Client abziehen musst.

Ich hab jetzt mal einen Test gemacht.
Im OnDisconnect hab ich folgenden Code reingeschrieben:
Delphi-Quellcode:
Label1.Caption := IntToStr(ServerSocket.Socket.ActiveConnections);
Das würde ja bedeuten, dass beim Disconnecten eines Clients die Anzahl der Verbindungen im Label1 sich verringern müsste, nur dies passiert nicht, daraus resultiert, dass OnDisConnect nicht ausgeführt wird, wenn noch eine andere Verbindung besteht.

Mein Timer hat dies aber mitbekommen.

Zacherl 4. Feb 2007 20:30

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Wie gesagt .. du musst im OnDisconnet einen Client abziehen dh:
Delphi-Quellcode:
Label1.Caption := IntToStr(ServerSocket.Socket.ActiveConnections -1);

Helmi 4. Feb 2007 20:50

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Zitat:

Zitat von Florian Bernd
Wie gesagt .. du musst im OnDisconnet einen Client abziehen dh:
Delphi-Quellcode:
Label1.Caption := IntToStr(ServerSocket.Socket.ActiveConnections -1);

Danke - hab jetzt rausgefunden warum mann 1 abziehen muss.

Nur bleibt die Frage, warum die Anzahl der Verbindungen im ActiveConnections nicht immer stimmt

Zacherl 4. Feb 2007 20:53

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Soweit ich das gesehen habe, kann das sein, wenn ein Client sich nicht ganz Standardkonform verabschiedet .. sprich z.b. der Prozess terminiert wurde ..
Da hilft meistens im OnException Ereigniss das OnDisconnect Ereigniss aufzurufen und ErrorCode auf 0 zu setzen.

Helmi 4. Feb 2007 20:55

Re: ServerSocket: ActiveConnections stimmt nicht immer
 
Meinst du das im Client?

und welchen ErrorCode - dem in OnException?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.
Seite 1 von 2  1 2      

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