Für meine Delphi- und Free Pascal Projekte verwende ich diverse
TCP Bibliotheken.
Diese unterscheiden sich in ihrer
API, manche sind eher high-level orientiert, andere nur ein kleiner Wrapper für die Windows
API.
Das macht einen Wechsel, oder bibliotheksunabhängige Programmierung (bei der mehrere Bibliotheken unterstützt werden) nicht leicht.
Dadurch motiviert, sammele ich auf GitHub nun Codebeispiele für typische, einfache, Aufgabenstellungen.
Die Repository-Adresse ist
https://github.com/michaelJustin/tcpclient-test
Teil 1: Lesen einer festen Anzahl von Bytes
Im ersten Teil des Projekts geht es um das Lesen einer festen Anzahl von Bytes vom Server. Dazu gibt es einen
TCP Server, der dem Client eine feste Anzahl bytes zurückgibt und dann die Verbindung trennt.
Client-Testanwendungen für diese Bibliotheken sind enthalten:
*
Indy 10 -
https://github.com/IndySockets/Indy
* Ararat Synapse -
https://sourceforge.net/p/synalist/c...AD/tree/trunk/
* Synopse -
https://synopse.info
Alle Client-Beispiele enthalten nur eine Methode:
function Read(AHost: string; APort: Integer; ALength: Integer): TBytes;
Diese wird von der Test-Methode aufgerufen, und die zurückggebene Länge ermittelt und ausgegeben.
Für
Indy sieht das Beispiel folgendermassen aus:
Delphi-Quellcode:
program FixedLengthClient;
uses
ClientMainIndy10,
SysUtils;
const
CONTENT_LENGTH = 8192;
SERVER_HOST = '
127.0.0.1';
SERVER_PORT = 30000;
procedure Test(AExpectedLength: Integer);
var
Response: TBytes;
begin
WriteLn(Format('
try to read %d bytes from %s:%d',
[AExpectedLength, SERVER_HOST, SERVER_PORT]));
Response :=
Read(SERVER_HOST, SERVER_PORT, AExpectedLength);
WriteLn(Format('
received %d bytes', [Length(Response)]));
end;
begin
try
Test(CONTENT_LENGTH);
Test(CONTENT_LENGTH - 1);
Test(CONTENT_LENGTH + 1);
// (surprise me)
except
on E:
Exception do
begin
WriteLn(E.
Message);
end;
end;
ReadLn;
end.
Für jede Bibliothek muss nur die entsprechende
Unit verwendet werden, und die anderen auskommentiert:
Delphi-Quellcode:
uses
//ClientMainIndy10,
//ClientSynapse266,
ClientSynopseCrtSock,
SysUtils;
Die Projekte sind zwar mit Free Pascal / Lazarus erstellt, sollten aber mit Delphi 2009 und neuer kompatibel sein. (Delphi
dpr Dateien können durch Umbenennen der lpr erzeugt werden)