Servus,
habe gerade mal meine Client - Server Anwendung getestet.
Soweit so gut. Funktioniert wunderbar.
Dann wollte ich mal wissen was da noch so geht und habe die Anwendung mal auf die Spitze gebracht.
Wenn ein Paket vom Client zum Server gesendet wird, wird zu erst ein Ping gesendet, dann x sekunden gewartet, kommt kein Pong vom Server wird die Verbindung getrennt und neu aufgebaut.
Wenn ein Pong kommt Paket senden.
Am Server kommen alle Pakete auser Ping in einen JobThread. Der Ping wird direkt beantwortet. Alle Daten befinden sich in einer TObjectlist. Diese wird dann in einer schleife abgearbeitet.
Der Test.
60 Clients wurden gestartet.
Jeder Client sendet pro Sekunde einen Testpaket.
Die letzten Clients trennen die Verbindung weil sie kein Pong bekommen.
Bauen die Verbindung neu auf und senden dann die Daten nach einer Zeit bekommen die Clients wieder kein Pong und trennen die Verbindung, sind aber immer nur die letzten Clients.
Hier mal ein wenig Code vom Server, dann kann man sich das besser vorstellen.
Delphi-Quellcode:
SetLength(sBuffer,Socket.ReceiveLength);
Socket.ReceiveBuf(PChar(sBuffer)^,Length(sBuffer));
//Sammeln von Jobs bis diese komplett sind
index := fBufferJobs.IndexOfObject(socket);
if index = -1 then
begin //noch kein job vorhanden
fBufferJobs.AddObject(sBuffer,socket);
index := fBufferJobs.Count-1;
end else //unvollständiger job vorhanden
fBufferJobs.Strings[index] := fBufferJobs.Strings[index] + sBuffer;
s := fBufferJobs.Strings[index];
while s <> '' do
begin
cmdSize := PCardinal(@s[1])^;
if length(s) < cmdSize then break;
sJob := copy(s,1,cmdSize);
Delete(s,1,cmdSize);
fBufferJobs.Strings[index] := s; //rest wieder zurück
if s = '' then begin //leer, dann löschen
fBufferJobs.Objects[index] := nil;
fBufferJobs.Delete(index);
end;
cmd := TCommandHandling.Create(CMDNone);
cmd.SetFrames(sJob);
case cmd.GetCmd of
SYS_ALIVE : begin
cd := fClientManager.Get(socket);
//...
end;
SYS_PING : begin
Pong := TCommandHandling.Create(SYS_PONG);
Socket.SendBuf(PChar(pong.SendFrames)^,Length(pong.SendFrames));
pong.Free;
end;
SYS_AUTHKEY : begin
//...
end;
else //kein systembefehl weiter bearbeiten
fJobThread.AddJobToSocket(socket,sJob);
end; //case
cmd.free;
end; //while
Kann mir gut vorstellen das die Sammelmethode oben Probleme macht und die letzten Clients immer Probleme haben.
Was meint ihr?
Ich könnte ja noch die Möglichkeit nutzen die Daten aufzuteilen und 2 oder 3 Threads zu bearbeiten. Dann kommt aber noch das Synchronisieren der Threads und ich denke da wird es bei mir auch noch Probleme geben.
Mfg