Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Server/ClientSocket Problem: Strings senden und empfängen??? (https://www.delphipraxis.net/28670-server-clientsocket-problem-strings-senden-und-empfaengen.html)

romber 27. Aug 2004 20:02


Server/ClientSocket Problem: Strings senden und empfängen???
 
Hallo!

Serverteil läuft auf einem Windows 2003 Server, optimiert für Anwendungen. Dabei handelt es sich um eine Anwendung, die die Daten filtert und die Ergebnisse (Strings) an alle aktive Clients weiterleitet. Da ich mit Indy TCP-Kompos nicht klar gekommen bin, habe ich alte gute TServer/ClientSockets benutzt.

Mehrere ständig laufende Threads benutzen eine Funktion, die die übergebene Strings an die Clients verschickt. Dabei werden mehrere Strings pro Sekunde verschickt, also ein permanenter Datenfluss. Beim Client landen dann die empfangenen Daten unbearbeitet in einer TListBox. Alles wunderbar, solange Serverteil und Clientteil lokal auf dem Server laufen.

Anders sieht es aus, wenn Client auf einem entfernten Rechner läuft und über das Internet die Daten empfängt. Dabei wird manchmal (nicht immer) eine empfangene String mit einem Teil der nächsten empfangenen String ergänzt und die letztere ohne dem Teil in die TListBox hinzufügt.

Ungefähr so:

Server sendet: 'Frankfurter Strasse 50, 40000 Frankfurt'
Server sendet: 'Dortmunder Srtasse 20, 30000 Dormund'
Server sendet: 'Berliner Strasse 70, 10000 Berlin'

Client-Anwendung auf dem lokalen Rechner, also auf dem Server-Rechner empfängt die Daten unverändert. Client auf dem entfernten übers Internet verbundenen Rechner empfängt ungefähr so:

Frankfurter Strasse 50, 40000 Frankfurt
Dortmunder Srtasse 20, 30000 DormundBerliner Strasse 70, 100
00 Berlin

Mache ich etwas falsch?

Hier sind die Teile der Code, die für Senden und Empfängen zuständig sind:

Server:

Code:
...
type
 LoadSiteThread = class (TThread)
private
 {private declarations}
http: TIdHTTP;
protected
 {protected declarations}
procedure Execute; override;
end;
...

procedure LoadSiteThread.Execute;
var
Quelltext: string;
begin
   ...
   Quelltext := http.Get('http://www.homepage.de');
   ...
   if FilterData(Quelltext) = false then Terminate //Aufruf der Funktion
end;

...
function FilterData(Data: string): Boolean;
var
FelteredData: string;
i: integer;
begin
  ... //Hier werden die Daten analysiert, also unwichtig
  if Length(FilteredData) > 0 then
  begin
       for i := 0 to frmMainForm.Server.Socket.ActiveConnections - 1 do //sende an alle aktive Clients
       frmMainForm.Server.Socket.SendText(FilteredData)
  else
       Result := false;
end;
...

Client:

Code:
...
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
ListData.Items.Insert(0, Socket.ReceiveText) //hier werden die Daten in die TListBox hinzufügt
end;
Was nun? Was ist falsch?

Danke!

MfG,
Ralfi

Muetze1 27. Aug 2004 23:36

Re: Server/ClientSocket Problem: Strings senden und empfänge
 
Moin!

Wie schon auf developia.de gesagt, es gibt keine Garantie, das die SendText() Blöcke genauso auch wieder ankommen. Die Packete werden verschickt und kommen auch weiter geteilt wieder an. Bei dem lokalen Rechner ist der Weg / Geschwindigkeit so gross, dass hier das Problem nicht auftritt. Daher nutze entweder ein Trennzeichen zum trennen der einzelnen Zeilen oder sende vor einem String dessen Länge. Auf der Empfangsseite musst du einen Buffer haben wo du dann immer die empfangenen Teile ablegst und komplett erhaltene kannst du dann verarbeiten...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 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