Autor Beitrag
ralfi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 153



BeitragVerfasst: Fr 27.08.04 20:00 
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:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
...
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:

ausblenden Quelltext
1:
2:
3:
4:
5:
...
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
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Fr 27.08.04 20:59 
also n fehler kann ich jetzt nicht entdecken. ich hab aber mit solchen applikationen so gut wie nichts am hut. :oops:

aber ich würde mal gerne ne idee einbringen:
um sicherzugehen, das jeder datensatzt sein ziel erreicht würd ich eine art start und stop-zeichen einbauen (am besten ein zeichen, was kein normales ascii zeichen ist).
der eingehende stream wird analysiert und es wird ein neues item hinzugefügt, wenn ein neues startzeichen gefunden wurde.
im grunde nichts anderes, was das protokoll eigendlich auch im kleineren format bereits macht.

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Caretaker
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 28.08.04 12:22 
hi,

wenn du am ende jedes zu übertragenen strings ein #13 oder chr(13) anfügst müsste es
klappen, oder?

so mach ich es zumindest immer...

cya
caretaker

_________________
Als Admin brauch man keine Feinde, man hat User.