Announcement

Collapse
No announcement yet.

http/httpd Komponente

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • http/httpd Komponente

    Ich habe ein Programm enwickelt, das per FTP Daten an einen Server schickt. Nun hat sich in der Praxis herausgestellt, daß der Port 21 in Firmennetzwerken sehr oft gesperrt ist. Deswegen möchte ich jetzt den Transfer über HTTP bzw Port 80 abwickeln. Hat jemand bereits Erfahrung damit. Da diese Änderung für mich einer Neuprogrammierung gleichkommt wäre ich über Erfahrungen und Anregungen dankbar!

  • #2
    Hallo,

    das folgende Beispielprojekt demonstriert, wie man über eine TCP/IP-Verbindung (frei wählbarer Port) beliebig grosse Daten vom Client zum Server übertragen kann. Dabei wird eine blockierende Socket-Verbindung genutzt, so das der Server für jede Client-Datenübertragung einen Thread abspaltet.

    <b>Server (TServerSocket)</b>

    In dem <b>TServerClientThread</b>-Nachfolger muss nur die Methode Execute überschrieben werden:

    <pre>
    TClientThread = Class(TServerClientThread)
    private
    public
    procedure ClientExecute; override;
    end;
    </pre>
    Die Execute-Methode des Thread verwendet <b>TWinSocketStream</b>, um die Daten auszulesen und <b>TFileStream</b>, um die ausgelesenen Daten in eine Datei zu schreiben:
    <pre>
    procedure TClientThread.ClientExecute;
    var
    sFileName : String;
    szBuffer : array[0..1024] of Char;
    aWSStream : TWinSocketStream;
    iBytes : Integer;
    aFStream : TFileStream;
    begin
    FillChar(szBuffer, SizeOf(szBuffer), #0);
    while not Terminated and ClientSocket.Connected do
    begin
    try
    sFileName := Format('C:\Temp\Socket%d.dat', [iFileCount]);
    // Blockierende Sockets mit 60 Sekunden Timeout
    aWSStream := TWinSocketStream.Create(ClientSocket, 60000);
    aFStream := TFileStream.Create(sFileName, fmCreate);
    try
    // Client muss innerhalb von 5 Sekunden mit der Übertragung beginnen
    if aWSStream.WaitForData(5000) then
    repeat
    iBytes := aWSStream.Read(szBuffer, SizeOf(szBuffer));
    if iBytes = 0 then
    // Fehlschlag -> Socket-Verbindung schliessen
    ClientSocket.Close
    else
    aFStream.WriteBuffer(szBuffer, iBytes);
    until not aWSStream.WaitForData(2000);
    finally
    aWSStream.Free;
    ClientSocket.Close;
    aFStream.Free;
    end;
    except
    end;
    end;
    end;
    </pre>
    Das TServerSocket-Ereignis <b>OnGetThread</b> tritt ein, wenn der Server-Socket einen neuen Thread für eine Verbindung zu einem Client-Socket erstellen muss:
    <pre>
    procedure TFormServer.ServerSocket1GetThread(Sender: TObject;
    ClientSocket: TServerClientWinSocket;
    var SocketThread: TServerClientThread);
    begin
    SocketThread := TClientThread.Create(False, ClientSocket);
    end;
    </pre>
    <b>Client (TClientSocket)</b>
    <pre>
    procedure TFormClient.ButtonSendClick(Sender: TObject);
    var
    aWSS : TWinSocketStream;
    aFS : TFileStream;
    begin
    if not OpenDialog1.Execute then
    Exit;
    StatusBar1.SimpleText := 'Sockets sind offen';
    ClientSocket1.Open;
    aWSS := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
    aFS := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
    try
    aWSS.CopyFrom(aFS, 0);
    finally
    aWSS.Free;
    aFS.Free;
    ClientSocket1.Close;
    end;
    end;
    </pre&gt

    Comment

    Working...
    X