Hallo zusammen!
Ich beschäftige mich momentan mit den Komponenten TServerSocket und TClientSocket. Damit alle Daten alle zuverlässig ankommen, erstellt der Server für jeden Client Socket einen neuen Thread. Im Internet habe ich dazu eine nette Lösung gefunden:
Delphi-Quellcode:
procedure TServerThread.ClientExecute;
var
ac, readlen : integer;
fRequest:
Array[0..1023]
of Byte;
begin
inherited FreeOnTerminate := TRUE;
try
fSocketStream := TWinSocketStream.Create(ClientSocket, 100000);
// 100000 is the timeout in miliseconds.
try
while (
not Terminated )
and ( ClientSocket.Connected )
do
try
if fSocketStream.WaitForData(10000)
then
begin
FillChar(fRequest, 1024, 0);
ac := 0;
repeat
readlen := fSocketStream.
Read(fRequest[ac], 1024);
inc(ac, readlen);
ShowMessage(IntToStr(readlen));
until (readlen = 0)
or (ac = 1024);
end;
except
on e:
exception do
begin
// An error has occurred, close and exit
ClientSocket.Close;
Terminate;
end;
end;
finally
fSocketStream.Free;
end;
except
on e:
exception do
begin
// An error has occurred, close and exit
ClientSocket.Close;
Terminate;
end;
end;
end;
Der Code an sich funktioniert soweit ganz gut. Wenn ich das erste Datenpaket von 2 Bytes sende, erhalte ich mittels meiner ShowMessage auch eine Datengröße von 2. Sende ich während die Meldung geöffnet ist weitere Daten, z.B. 10x 2 Byte große Datenpakete, wird in der nächsten Meldung 20 angezeigt. Die Pakete werden also alle in einen Buffer gequetscht, statt die Funktion 10x aufzurufen. Gibt es da einen komfortablen Weg um die Pakete wieder zu splitten? Die Größe der Daten ist nicht immer gleich, die Daten in 2 Byte große Häppchen zu zerschneiden ist also keine Lösung.
Liebe Grüße