Announcement

Collapse
No announcement yet.

Newbie-Frage

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

  • Newbie-Frage

    Hi,
    ich hab erst vor kurzem mit Delphi angefangen, und möchte nun gerne ein Programm schreiben, dass zwischen zwei Rechner im internet eine TCP-Verbindung aufbaut. Ich kann zwar die Verbindung herstellen, weiß jetzt aber nicht, wie ich Daten über diese sende. Kann mir das jemand kurz erklären?? Thanx

    Alex

  • #2
    Hallo,

    das folgende Beispielprojekt demonstriert, wie man über eine TCP/IP beliebig große Daten übertragen kann. Dabei wird eine blockierende Socket-Verbindung genutzt, so das der Server für jede Client-Datenübertragung einen Thread abspaltet. In der Client-Anwendung wird über den <i>Datei öffnen</i>-Dialog die zu übertragende Datei ausgewählt. Anschliessend wird eine <b>TWinSocketStream</b>-Instanz mit der <B>TClientSocket</b>-Instanz verbunden, so das jedes in den Stream kopierte Byte über die Socket-Verbindung zum Server transportiert wird. TWinSocketStream kann nur bei blockierenden Sockets-Verbindungen eingesetzt werden, daher wird die Eigenschaft <b>ClientType</B> im Objektinspektor auf <b>ctBlocking</b> konfiguriert.
    <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;
    StatusBar1.SimpleText := 'Sockets sind geschlossen';
    ListBoxFiles.Items.Add(OpenDialog1.FileName);
    end;
    </pre>
    Der Server speichert jede vom Client übertragene Datei unter einem fortlaufenden Dateinamen ab. Die globale Hilfsvariable <i>iFileCount</i> wird dabei über die Win32-API-Funktion <b>InterlockedIncrement</b> threadsicher hochgezählt. Das TServerSocket-Ereignis <b>OnClientDisconnect</b> immer dann ausgelöst, wenn eine Datenübertragung abgeschlossen ist - daher erfolgt auch an dieser Stelle das Aktualisieren der globalen Hilfsvariable für den fortlaufenden Dateinamen
    <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>

    In meinem demnächst erscheinenden Buch <b>Delphi Win32-Lösungen</b> sind detaillierter Infos und weitere Beispiele zu finden

    Comment

    Working...
    X