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