![]() |
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? |
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.
|
Re: ServerSocket: ActiveConnections stimmt nicht immer
Hallo,
Abgefragt wird in einem Timer:
Delphi-Quellcode:
Der Timer läuft immer.
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; 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 |
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.
|
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 |
Re: ServerSocket: ActiveConnections stimmt nicht immer
Zitat:
Im OnDisconnect hab ich folgenden Code reingeschrieben:
Delphi-Quellcode:
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.
Label1.Caption := IntToStr(ServerSocket.Socket.ActiveConnections);
Mein Timer hat dies aber mitbekommen. |
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);
|
Re: ServerSocket: ActiveConnections stimmt nicht immer
Zitat:
Nur bleibt die Frage, warum die Anzahl der Verbindungen im ActiveConnections nicht immer stimmt |
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. |
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. |
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