Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi stream per TWinsocket (https://www.delphipraxis.net/30150-stream-per-twinsocket.html)

glkgereon 21. Sep 2004 14:15


stream per TWinsocket
 
hi, ich möchte eine datei einlesen und per twinsocket versenden

dazu wollte ich tstream nehmen

also ich hab das bisher so in etwa:
(buftype gibt an was kommt)

Delphi-Quellcode:
if ClientSocket.RecieveBuf(temp, sizeof(temp))<>-1
then begin
     if buftype = liConnections //sendlist
     then Recievelist
     else if buftype = liFileList
     then recievefilelist
     else if buftype = liFile //sendfile
     then recievefile;
aber was muss ich jetzt in recievefile reinschreiben?

so in etwa geht das ja mit senden:

Delphi-Quellcode:
str:TStream;
begin
str:=TStream.Create;
str.LoadFromFile(Dateiname);
ServerSocket.Socket.SendBuf(str);
und dann beim empfangen das von oben

das problem: tstream hat kein loadfromfile/savetofile..

oder hat einer einen anderen vorschlag (ausser tstream)?
weiss einer wie ich mit tstream umgehe?
versende ich das so, wie oben angegeben?

Manzoni 21. Sep 2004 14:58

Re: stream per TWinsocket
 
Zitat:

Zitat von SwissDelphiCenter.ch
...eine Datei vom TServerSocket an den TClientSocket schicken?
http://www.swissdelphicenter.com/de/...de.php?id=1072

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    btnTestSockets: TButton;
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure btnTestSocketsClick(Sender: TObject);
  private
    FStream: TFileStream;
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm} 

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  iLen: Integer;
  Bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  //Die Länge der Daten in Byte wird empfangen
  GetMem(Bfr, iLen);
  //Arbeitsspeicher für die Daten wird reserviert. Dies kann bei großen Dateien zum Problem werden.
  //Die Methode eignet sich nur für kleinere.
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    //Der Puffer des Socket wird in den Speicher geschrieben. Bfr zeigt auf die Daten.
    FStream.Write(Bfr^, iLen);
    //Die Daten werden in den FileStream geschrieben.
  finally
    FreeMem(Bfr);
    //Der verwendete Speicher wird wieder freigegeben.
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FStream := nil;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(FStream) then FreeAndNil(FStream);
  //Der Stream muss bei dem Verlassen des Programmes freigegeben werden.
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if Assigned(FStream) then FreeAndNil(FStream);
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  FStream := TFileStream.Create('c:\temp\test.stream.html', fmCreate or fmShareDenyWrite);
  //Der Client empfängt die Daten(in dem Fall die Datei). Beim Verbinden mit dem Server, wird die Datei angelegt. Näheres zu Streams siehe OH.
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.SendStream(TFileStream.Create('c:\temp\test.html', fmOpenRead or fmShareDenyWrite));
  //Der Server sendet an jeden Client, der sich verbindet die Datei(den Stream).
end;

procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
  ServerSocket1.Active := True;
  ClientSocket1.Active := True;
end;

end.


glkgereon 21. Sep 2004 15:27

Re: stream per TWinsocket
 
kannste den quelltext nich ein wenig erläutern?

ich versteh nämlich nur bahnhof... :(

Manzoni 21. Sep 2004 22:48

Re: stream per TWinsocket
 
Ich hab ein paar Komentare in den Quelltext geschrieben. Ich weiss nicht ob dir die so weiterhelfen, hoffe es zumindest. Eventuell hilft dir ja dieser Beitrag auch noch weiter.

glkgereon 22. Sep 2004 06:13

Re: stream per TWinsocket
 
zum erstenm is mir jetzt dein qt klarer, und das indy-beispiel guck ich mir auch ma an


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 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