Einzelnen Beitrag anzeigen

romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#1

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

  Alt 27. Aug 2004, 20:02
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
  Mit Zitat antworten Zitat