die WinSocket-komponenten haben nur eine begrenzte Anzahl von Zeichen, die gleichzeitig versendet werden können. (bei mir sind das 8192 Byte). Das Problem bei längeren Zeichenketten ist das zusammenfügen...
bei
Indy hast du das Problem nicht, da es schon gemanaged wurde...
kleines Beispiel für
Indy
Server
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TidPeerThread)
var befehl: string;
begin
befehl := Athread.Connection.ReadLn;
if Copy(befehl, 1, 3) = 'SCR' then
begin
// zum Beispiel einen Screenshot mit einem Stream senden mittels
AThread.Connection.WriteStream(Stream);
// zum einfacheren abfragen auf der Clientseite:
AThread.Connection.disconnect;
end;
if Copy(befehl, 1, 3) = 'TEX' then
Athread.Connection.WriteLn('Text');
// Bei einfachen Zeichenketten ist das nicht so umständlich
end;
end;
hier ist so ganz nebenbei noch zu empfehlen, den Execute-Block für ThreadSave in einen TCriticalSection-Block zu stecken (.Enter / .Leave)
Client
Delphi-Quellcode:
procedure Get;
begin
// TCPClient sollte schon verbunden sein
IdTCPClient1.WriteLn('SCREEN');
while IdTCPClient1.Connected do
IdTCPClient.ReadStream(Stream, -1, true) // Warten bis disconnect siehe oben
//...
IdTCPClient1.WriteLn('TEXT');
showmessage(IdTCPClient1.ReadLn);
end;
bei WinSockets gehts beim Server ähnlich. beim Client läuft das lesen über eine extra Prozedur, wesshalb der Programmablauf etwas unübersichtlich wird und alle Antworten in der selben Prozedur, die durchaus mal 800 mal hintereinander aufgerufen werden kann, behandelt werden.
rollstuhlfahrer