![]() |
Client/Server. Pakete schneller abarbeiten.
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:
Kann mir gut vorstellen das die Sammelmethode oben Probleme macht und die letzten Clients immer Probleme haben.
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 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 |
Re: Client/Server. Pakete schneller abarbeiten.
keiner ne idee wie man sowas schneller machen könnte?
Oder ist das alles zu unübersichtlich? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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