![]() |
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 |
Re: Transfer von Daten mit Pause bzw. Abbrech Button
Datei verschicken wurde grade gelöst :D
![]() Mit nem Abbrechen-Button weiß ich leider nicht... gut wär auch noch ein fortschrittsbalken :) |
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)
|
Re: Transfer von Daten mit Pause bzw. Abbrech Button
Mit der Lösung vom
![]()
Delphi-Quellcode:
und dann noch auf einen Button legen "Abbruch := True"...
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; |
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 ;) ) |
Re: Transfer von Daten mit Pause bzw. Abbrech Button
Müsste klappen, wenn nicht erst nochmal mit
Delphi-Quellcode:
probieren - ich weiss nämlich nicht, ob Boolean-Variabeln beim Start True oder False sind. :wink:
var
Abbruch : boolean = False; |
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); |
Re: Transfer von Daten mit Pause bzw. Abbrech Button
Zitat:
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. |
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; |
Re: Transfer von Daten mit Pause bzw. Abbrech Button
Zitat:
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. |
Re: Transfer von Daten mit Pause bzw. Abbrech Button
Mein bisheriger Quellcode war:
Delphi-Quellcode:
@Net7
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; Das mit dem zerstückeln des Streams klingt gut, nur ich weiß nicht wie man einen Stream zerstückelt :D |
Re: Transfer von Daten mit Pause bzw. Abbrech Button
hallo??
|
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:
Ich hoffe das war, was du gesucht hast =)
...
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz