Announcement

Collapse
No announcement yet.

Dateien transferieren zwischen ClientSocket und ServerSocket

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

  • Dateien transferieren zwischen ClientSocket und ServerSocket

    Hallo
    Ist es möglich, mit den Socket-Komponenten eine beliebige Datei vom Server zum Client und umgekehrt zu transferieren? Geht das mit der Funktion SendBuf und RecieveBuf? Wenn ja, wie schreibe ich dann die Datei in den Buffer und beim Empfänger wieder zurück?
    MfG
    rd

  • #2
    Hallo,

    zur Frage 1: Ja.

    zur Frage 2: Ein Beispielprojekt dafür ist in meinem Buch <i>Delphi Win32-Lösungen</i> im Verzeichnis <i>Kapitel IPC\Sockets\Delphi 3\TCPCopy</i> der CDROM zu finden. Das es sich um ein altes Beispielprojekt handelt, nutzt es die damals (Delphi 3) aktuelle TTCP-Komponente.

    Sender:
    <pre>
    procedure TFormMain.SendTCPData(pSource: Pointer; iSize: Integer);
    var
    pHeader : PTcpHeader;
    vHeadBuffer,
    vDataBuffer : Variant;
    pDataBuffer : Pointer;
    begin
    pHeader := AllocMem(SizeOf(TTcpHeader));
    try
    pHeader^.iSize := iSize;
    pHeader^.iTag := TcpData_EXE;
    StrLCopy(pHeader^.szFile, PChar(sFileName), 12);
    // privaten Record als Header senden
    try
    vHeadBuffer := VarArrayCreate([0, SizeOf(TTcpHeader) - 1],
    VarByte);
    pDataBuffer := VarArrayLock(vHeadBuffer);
    Move(pHeader^, pDataBuffer^, SizeOf(TTcpHeader));
    finally
    VarArrayUnlock(vHeadBuffer);
    end;
    TCP1.SendData(vHeadBuffer);
    finally
    FreeMem(pHeader);
    end;
    // Stream mit den EXE-Dateiinhalt senden
    vDataBuffer := VarArrayCreate([0, iSize -1] , VarByte);
    try
    pDataBuffer := VarArrayLock(vDataBuffer);
    Move(pSource^, pDataBuffer^, iSize);
    finally
    VarArrayUnlock(vDataBuffer);
    end;
    TCP1.SendData(vDataBuffer);
    end;
    </pre>
    Empfänger:
    <pre>
    procedure TMainForm.TCPAcceptDataArrival(Sender: TObject;
    bytesTotal: Integer);
    var
    pSeekByte : pByte;
    vDatabuffer,
    vHeaderbuffer : OleVariant;
    pDatabuffer : Pointer;
    begin
    // Anzahl der Datenpakete mitzählen
    Inc(iPacketCnt);
    StatusBar1.Panels[0].Text := 'Übertragung beginnt ...';
    Refresh;
    // Start mit der privaten Struktur (Header)
    if pHeader = nil then begin
    // 1. Paket = private Header-Struktur vom Typ TTcpHeader
    pHeader := AllocMem(SizeOf(TTcpHeader));
    vHeaderBuffer := VarArrayCreate([0,SizeOf(TTcpHeader) -1],
    varByte);
    // Header-Struktur auslesen
    TCPAccept.GetData(vHeaderBuffer, (VT_Array or VT_ui1),
    SizeOf(TTcpHeader) );
    try
    // Header-Struktur in die globale Variable sichern
    pDatabuffer := VarArrayLock(vHeaderBuffer);
    Move(pDatabuffer^, pHeader^, SizeOf(TTcpHeader));
    finally
    VarArrayUnlock(vHeaderBuffer);
    end;
    // Anzeige im Formular aktualisieren
    sFileName := StrPas(pHeader^.szFile);
    LabelFileName.Caption := sFileName;
    LabelFileSize.Caption := Format('%d kByte',
    [pHeader^.iSize div 1024]);
    Refresh;
    // Dateigröße steht fest -> Puffer anfordern
    pData := AllocMem(pHeader^.iSize + 1 * SizeOf(Byte));
    end else begin
    // nicht der erste Aufruf -> Daten der zu übertragenden Datei
    vDataBuffer := VarArrayCreate([0, BytesTotal], varByte);
    // an welche Stelle muß der neue Datenblock kopiert werden?
    pSeekByte := pData;
    Inc(pSeekByte, iCount);
    Inc(iCount, TCPAccept.BytesReceived);
    // Datenblock abholen
    TCPAccept.GetData(vDataBuffer, (VT_Array or VT_ui1),
    BytesTotal);
    try
    pDatabuffer := VarArrayLock(vDataBuffer);
    // Datenblock an die aktuelle Position kopieren
    Move(pDatabuffer^, pSeekByte^, BytesTotal);
    finally
    VarArrayUnlock(vDataBuffer);
    end;
    // wurde die komplette Dateigröße übertragen ?
    if iCount = pHeader^.iSize then begin
    StatusBar1.Panels[0].Text := '...Übertragung beendet!';
    StatusBar1.Panels[1].Text := Format(' %d Bytes.',[iCount]);
    LabelPacketCount.Caption := IntToStr(iPacketCnt);
    // private Methode verarbeitet die Daten
    UseData(pData, iCount, pHeader^.iTag);
    // alles für die nächste Übertragung aufräumen
    FreeMem(pheader);
    pHeader := nil;
    iCount := 0;
    iPacketCnt := 0;
    FreeMem(pData);
    end
    end;
    end;
    </pre&gt

    Comment

    Working...
    X