15. juni 2002 - 17:18Der 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.
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.
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.
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.
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.
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.
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;
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;
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.