Avatar billede wired Nybegynder
15. juni 2002 - 17:18 Der er 14 kommentarer og
1 løsning

Simpel FTP Server/Client

Jeg skal sende en fil fra en computer til en anden (lokalnet), men det skal ske i baggrunden. Hvordan gøres det nemmest. Gerne et direkte eksempel(server/client). Filnavn er kendt.
Har prøvet med Indy TrivialFTP men den går ned hvis man viser et ur samtidigt.
Avatar billede topsite Nybegynder
15. juni 2002 - 18:27 #1
hej wired,

kig på ICS komponentet, det er meget enkelt at bruge, download og inst. det, og træk en ftpserv ned i din form, og udfyld felterne i properties, eller kig på det inkluderede eksempel.

Download komponentet fra:
http://overbyte.alexid.fr/frame_index.html
Avatar billede topsite Nybegynder
15. juni 2002 - 18:27 #2
Kig på disse eksempler:

FtpTst A full featured FTP client based on the TFtpCli component.
FtpSrv A full featured FTP server based on the TFtpSrv component.
Avatar billede dkn Nybegynder
15. juni 2002 - 18:29 #3
NMStrm client og server er også nemme at bruge til filetransfer.

Kig evt på demoen som er med i delphi under fastnet. Ellers kan jeg poste det kode som kræves.
Avatar billede wired Nybegynder
15. juni 2002 - 18:45 #4
Det vil jeg meget gerne have dkn. Kan bedst lide at undgå at skulle bruge andre komponenter, men vil dog prøve begge dele og I vil begge få fulde point om det virker.
Avatar billede dkn Nybegynder
15. juni 2002 - 19:09 #5
//Sender siden (client)

var
  MyFStream: TFileStream;
begin
If OpenDialog1.Execute then
  Begin
    NMStrm1.Host := '127.0.0.1';
    MyFStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
    try
      NMStrm1.PostIt(MyFStream);
    finally
      MyFStream.Free;
    end;
  end;
end;


Server side Onmsg:
----------------
var
  MyFStream: TFileStream;
begin
  If FileExists('.\tmp.file') then DeleteFile('.\tmp.file');
  MyFStream := TFileStream.Create('.\tmp.file', fmCreate);
  try
    MyFStream.CopyFrom(strm, strm.size);
  finally
    MYFStream.Free;
  end;
end;


Husk endvidere at sætte:
.ReportLevel := Status_Basic;
.TimeOut := 90000;
Det eneste problem med det her er at filnavnet ikke bliver sendt med, det kan dog løses ved at lave en anden connection bare med client/server sock, og så sende filnavn inden selve filen bliver sendt.
Avatar billede wired Nybegynder
15. juni 2002 - 19:35 #6
Excellent - Det virker bare dkn mange tak.

Jeg skal dog lige høre er steaming ikke en usikker protokol?
Er man sikker på at dataerne kommer korrekt over en steaming?
Avatar billede wired Nybegynder
15. juni 2002 - 19:39 #7
Hvordan sender jeg i øvrigt den anden vej - Altså download. Det skulle gerne være clienten som modtager en fil når den spørg serveren. Serveren ved på forhånd hvilken fil som den skal sende.
Avatar billede dkn Nybegynder
15. juni 2002 - 20:09 #8
streamning er jo ikke lige frem en protocol. Du kan sende streams bare ved hjælp af de normale client server sockets som også er i delphi, og de kører jo tcp. Hvis du skal sende den anden vej er du nød til at gøre nøjagtig det samme bare den anden vej rundt, hmmm :)
Altså du kan kun sende til serveren med nmstream.
Avatar billede topsite Nybegynder
15. juni 2002 - 21:54 #9
Ja lav en "server side" i klienten :P
Avatar billede wired Nybegynder
24. juni 2002 - 22:54 #10
Execellent. det virkede mange tak...
Af en eller anden grund virker avanceret ikke?
Avatar billede dkn Nybegynder
25. juni 2002 - 04:29 #11
avanceret hvad mener du?
Avatar billede wired Nybegynder
25. juni 2002 - 07:30 #12
Jeg ville bare dele point mellem jer
Avatar billede wired Nybegynder
26. juni 2002 - 00:59 #13
Kære dkn

Mange tak for dit svar - det virkede perfekt..

Det virker som om du bare har styr på det...

Kunne man eventuelt sende en kolonne StringGrid1.cols[1] via stream i stedet for en fil, og modtage det i en StringGrid1.cols[1] i et andet program, lige så nemt? Jeg har prøvet med følgende:

Server OnMsg:
------------
var
  MyStrStream : TMemoryStream;
begin
  MyStrStream := TMemoryStream.Create;
  try
    StringGrid1.Cols[1].LoadFromStream(strm);
  finally
    MyStrStream.Free;
  end;
end;

og on client.

Var
  MyStrStream  : TMemoryStream;

Begin
    MyStrStream := TMemoryStream.Create;
    StringGrid1.Cols[1].SaveToStream(MyStrStream);
  try
    NMStrm1.SendStream(MyStrStream);
  finally
    MyStrStream.Free;
  end;
end;

Det haster lidt... er 60 point ok.?
Avatar billede dkn Nybegynder
26. juni 2002 - 14:36 #14
Ja det er okay :)

Det virker åbentbart ikke at bruge SaveToStream fra nogle componenter.
Derfor er man nødt til at gøre sådan her, selvfølgelig bliver det stadig sendt som en stream:

Du skal smide en stringlist på både server og client.

Server:

procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: string;
  strm: TStream);
var
  SS: TStringStream;
begin
  SS := TStringStream.Create('');
  try
    SS.CopyFrom(strm, strm.size);
    StringGrid1.Cols[1].Text := SS.DataString;
  finally
    SS.Free;
  end;
end;


Client:

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cols[1].Add('Test');
StringGrid1.Cols[1].Add('lala');
StringGrid1.Cols[1].Add('132');
end;

Client send knap:

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
begin
  NMStrm1.Host := '127.0.0.1';
  MS := TMemoryStream.Create;
  try
    StreamLn(MS, StringGrid1.Cols[1].Text);
    NMStrm1.PostIt(MS);
  finally
    MS.Free;
  end;
end;


MVH
dkn
Avatar billede dkn Nybegynder
26. juni 2002 - 22:02 #15
virker det for dig ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester