Einzelnen Beitrag anzeigen

mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#1

Beispielcode für TCP Socket Client Bibliotheken (Delphi & Free Pascal)

  Alt 11. Dez 2022, 13:22
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)
Michael Justin
habarisoft.com

Geändert von mjustin (11. Dez 2022 um 17:38 Uhr) Grund: Tag "Sockets" fehlte
  Mit Zitat antworten Zitat