Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Transfer von Daten mit Pause bzw. Abbrech Button (https://www.delphipraxis.net/56073-transfer-von-daten-mit-pause-bzw-abbrech-button.html)

bladecs 31. Okt 2005 18:50


Transfer von Daten mit Pause bzw. Abbrech Button
 
Ich suche nach einer Möglichkeit, Daten über ein TServersocket an einen TClientsocket zu versenden. Man sollte jedoch zudem die Mögl. haben, den Transfer zu "pausieren" und abzubrechen.

Thx im Voraus

Master_RC 31. Okt 2005 19:02

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Datei verschicken wurde grade gelöst :D
http://www.delphipraxis.net/internal...ct.php?t=66969

Mit nem Abbrechen-Button weiß ich leider nicht...
gut wär auch noch ein fortschrittsbalken :)

bladecs 31. Okt 2005 19:10

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Das verschicken ist ja kein Problem, nur ich weiß nicht, wie ich den Transfer abbrechen oder pausieren kann. (Über TServersocket & Tclientsocket)

St.Pauli 31. Okt 2005 19:24

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Mit der Lösung vom Swissdelphicenter:

Delphi-Quellcode:
var
  Form1: TForm1;
  Abbruch : boolean;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  iLen: Integer;
  Bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  try
    IF Abbruch THEN exit;
    Socket.ReceiveBuf(Bfr^, iLen);
    FStream.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
  end;
end;
und dann noch auf einen Button legen "Abbruch := True"...

Master_RC 31. Okt 2005 19:39

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Danke, werds so früh wie möglich ausprobieren!
(Wobei beim SDCenter ja eigentlich klar sein sollte, dass es funzt ;) )

St.Pauli 31. Okt 2005 19:46

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Müsste klappen, wenn nicht erst nochmal mit

Delphi-Quellcode:
var
  Abbruch : boolean = False;
probieren - ich weiss nämlich nicht, ob Boolean-Variabeln beim Start True oder False sind. :wink:

bladecs 31. Okt 2005 22:07

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Ich will, dass ich die Dateiübertragung des Servers pausieren/stoppen kann.
Also wenn ich eine Datei vom Server zum Client schicke, möchte ich nicht nur, dass der Client sie nicht annimmt, sondern dass der Server wartet bis der Client wieder bereit ist und erst dann weiter sendet.

Bei eurem Beispiel nimmt er die Daten nur nicht an:

Code:
IF Abbruch THEN exit;
    Socket.ReceiveBuf(Bfr^, iLen);

Net7 31. Okt 2005 22:16

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Zitat:

Zitat von bladecs
Ich will, dass ich die Dateiübertragung des Servers pausieren/stoppen kann.
Also wenn ich eine Datei vom Server zum Client schicke, möchte ich nicht nur, dass der Client sie nicht annimmt, sondern dass der Server wartet bis der Client wieder bereit ist und erst dann weiter sendet.

Bei eurem Beispiel nimmt er die Daten nur nicht an:

Code:
IF Abbruch THEN exit;
    Socket.ReceiveBuf(Bfr^, iLen);


Das ist richtig, und das soll auch so sein. Stell dir den Socketbuffer wie ein Briefkasten vor. Wenn du nix abholst, füllt sich der Briefkasten eben, solange bis er überläuft (DOS ähhm Spam -Attacke :mrgreen: ), oder du deine Briefe komplett abholst.

So funzt das auch mit den Sockets, die werden solange gefüllt bis der Client fertig ist mit senden.

Solange du nix ausließt bleibt alles im Socket. Bis du wieder Socket.ReceiveBuf(Bfr^,iLen); aufrufst.

bladecs 1. Nov 2005 14:38

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
thx, nur wie kann ich das Versenden der Datei abbrechen, ohne die Verbindung zu schließen.

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Socket.SendStream(TFileStream.Create('c:\datei.exe', fmOpenRead or fmShareDenyWrite)); // Diesen Transfer möchte ich abbrechen können, ohne die Verbindung zum client zu schließen bzw. den Server zu schließen (also der Server soll die Datei erst gar nicht weiter schicken)
end;

Net7 1. Nov 2005 15:09

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Zitat:

Zitat von bladecs
thx, nur wie kann ich das Versenden der Datei abbrechen, ohne die Verbindung zu schließen.

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Socket.SendStream(TFileStream.Create('c:\datei.exe', fmOpenRead or fmShareDenyWrite)); // Diesen Transfer möchte ich abbrechen können, ohne die Verbindung zum client zu schließen bzw. den Server zu schließen (also der Server soll die Datei erst gar nicht weiter schicken)
end;


Joa gute frage.. dazu müstes aber diese Procedure anpassen.

Ich würde zb. das mit Write (Methode von TWinSocketStream)versuchen. Man stückelt die Größe des Streams
und schickt zb. immer nur 1 kb.

Dann wird abgefragt ob der User "Stopp den Transfer" gedrückt hat, wenn nicht wieder 1 Kb usw.

Wenn der User abbricht, wird eine Nachricht an den Client verschickt.

Siehe dir mal das Beispiel bei Write(Methode von TWinSocketStream) an.

bladecs 6. Nov 2005 13:01

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Mein bisheriger Quellcode war:

Delphi-Quellcode:
uses ...jpeg,strutils;



// Screenshotprocedure /////////////////////////////////////////////////////
procedure ScreenShot(const Bitmap: TBitmap);
var
  DesktopDC: HDC;
begin
  DesktopDC := CreateDC('DISPLAY', nil, nil, nil);
  try
    Bitmap.PixelFormat := pfDevice;
    Bitmap.Width := Screen.Width;
    Bitmap.Height := Screen.Height;
    BitBlt(Bitmap.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY);
  finally
    DeleteDC(DesktopDC);
  end;
end;
////////////////////////////////////////////////////////////////////////////


// Für den Client: /////////////////////////////////////////////////////////
var
Rec: Boolean=false;
rM: TMemoryStream;
rSize: Int64;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
rL : Integer;
Pic: TJpegimage;
begin
rL := Socket.ReceiveLength;
If rL = 0 then Exit;
If Rec then begin
   Socket.ReceiveBuf(Pointer(Int64(rM.Memory) + rM.Position)^, rL);
   rM.Position := rM.Position + rL;
   ProgressBar1.Position:=round(rm.position/rsize*100);
        If rM.Position = rSize then begin
        ProgressBar1.Position:=100;
        rM.Position := 0;
        Pic := TJpegimage.Create;
            try
            Pic.LoadFromStream(rM);
            Image1.Picture.Assign(Pic);
            Image1.Refresh;
            finally
            Pic.Free;
            end;
        FreeAndNil(rM);
        Rec := False;
        end;
end
else begin
    rSize := StrToInt(Socket.ReceiveText);
    rM := TMemoryStream.Create;
    rM.SetSize(rSize);
    rM.Position := 0;
    Rec := True;
    Socket.SendText('ok');
    end;
end;
// Ende der Clientprocedure ////////////////////////////////////////////////


// Für den Server: /////////////////////////////////////////////////////////
var
sM : TMemoryStream;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
Bmp : TBitmap;
Jpeg : TJpegimage;
empfangen:string;
begin
empfangen:=socket.ReceiveText;

if leftstr(empfangen,length('Screenshot'))='Screenshot' then begin
    FreeAndNil(sM);
    Bmp:=TBitmap.Create;
    Jpeg:=TJpegImage.Create;
    sM:=TMemoryStream.Create;
        try
        ScreenShot(bmp);
       Jpeg.CompressionQuality:=strtoint(rightstr(empfangen,length(empfangen)-length('Screenshot')));
        Jpeg.Assign(Bmp);
        Jpeg.SaveToStream(sM);
        finally
        Jpeg.Free;
        Bmp.Free;
        end;
    Socket.SendText(IntToStr(sM.Size));
end;

// Empfänger hat Größe erhalten, das senden der Datei wird durchgeführt
If empfangen='ok' then begin
Socket.SendBuf(sM.Memory^, sM.Size);   // genau diesen Vorgang will ich abbrechen können bzw. pausieren können
end;
end;
// Ende der Serverprocedure ///////////////////////////////////////////////////




// Screenshot anfordern
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientSocket1.Active then begin
ClientSocket1.Socket.SendText('Screenshot'+inttostr(scrollbar1.Position)); //Über die Scrollbar stell ich die Screenshot Qualität ein
end;
end;
@Net7
Das mit dem zerstückeln des Streams klingt gut, nur ich weiß nicht wie man einen Stream zerstückelt :D

bladecs 8. Nov 2005 20:11

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
hallo??

H4ndy 19. Dez 2005 13:02

Re: Transfer von Daten mit Pause bzw. Abbrech Button
 
Also das zerstückeln geht an sich einfach (Ich benutze hier einen MemoryStream für das Teilstück):
Delphi-Quellcode:
...
var MemStream: TMemoryStream;
...

MemStream := nil;
try
  MemStream := TMemoryStream.Create;

  Stream.Position := 0;
  while Stream.Pos < Stream.Size do begin
    MemStream.Clear;
    if (Stream.Pos+1024) <= Stream.Size then
      MemStream.CopyFrom(Stream,1024) // 1KB kopieren
    else
      MemStream.CopyFrom(Stream,Stream.Size - Stream.Pos); // Rest kopieren

    // Hier den MemStream versenden

  end;
finally
  MemStream.Free;
end;
Ich hoffe das war, was du gesucht hast =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz