phsteckel,
anbei das Demo Projekt. Es ist ein Client und ein Server - wie auch zu erwarten. Basierend auf den aktuellen
INDY Komponenten habe ich im lokalen LAN einen Durchsatz von knapp 10 MB/sek erreicht, bei nur minimaler Auslastung der einzelnen Rechner.
Das ist kein fertig ausgearbeitetes Protokoll, sondern diente lediglich als Vorlage. Die einzelnen Schritte
- Connection aufbauen
- Client -> Server HELO name
- Server -> Client +OK HELO (RandomID) - Die Random ID kann zum Verschlüsseln von Passwörtern genutzt werden
- Client -> Server SIGN clientID
- Server -> Client +OK
- Client -> Server PASS passcode
- Server -> Client +OK oder -ERR
- Client -> Server PACK SourcePath;SourceFileName;FileSize
- Client -> Server Daten der Datei
- Server :: Speichern und Verbindungsabbruch
Threading ist heir nicht eingebaut, aber sehr leicht zu erreichen. Einfach für den Client eine separate Klasse erstellen. Bei Verbindungsaufbau eine Instanz der Klasse erstellen und diese dem Parameter
AThread.Data zuweisen. Bei Verbindungsabruch diese Instanz wieder zerstören
Mit jedem Command kann mann dann über
TKlassenName(ASender.Thread.Data) wieder auf den Clientthread zugreifen. Zusätzlich die
TIdThreadMgrDefault in das Projekt aufnehmen und mit dem TCPServer verbinden.
Im Beispiel verweise ich auf die Unit uRoutines, welche Du nicht hast. In dieser ist lediglich die folgende Routine interessant.
Delphi-Quellcode:
function FetchA(
var aSource: AnsiString; aDelimiter: AnsiChar = ';'; aDelete: Boolean = True
): AnsiString;
var
I: Integer;
begin
// find delimiter in element list
I := Pos(aDelimiter, aSource);
if I > 0 then
begin
// return next element
Result := Copy(aSource, 1, I - 1);
if aDelete then
// remove returned element from list
Delete(aSource, 1, I);
end else begin
// element is last in element list, return
Result := aSource;
if aDelete then
// clear element list
aSource := '';
end;
end;