Posílání souborů po síti
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Posílání souborů po sítiPosílání souborů po síti

 

Posílání souborů po síti

Google       Google       13. 3. 2007       19 332×

V tomto díle si ukážeme, jak poslat soubor po počítačové síti.

Reklama
Reklama

V jednom z minulých dílu jsme se učili udělat chat v Delphi za pomocí komponent ServerSocket a ClientSocket. Jestliže nemáte žádné zkušenosti s těmito komponentami, doporučoval bych článek si přečíst. Začnu asi trochou teorie, jak by nám to posílání mělo fungovat. Nejprve si na klientském počítači vybereme soubor, který budeme chtít odeslat. Po tom, co si soubor vybereme, připojíme se k našemu serveru a odešleme mu název souboru a jeho velikost. Jakmile budou základní informace o souboru odeslané, stačí už jen odeslat soubor. Obrázek klienta:

Ještě je tam komponenta OpenDialog. U Button2 a Button3 nastavte Enabled na False. A teď zdrojový kód:

….
  private
    Soubor_Stream:TFileStream; //vytvoření proměnné, přes kterou budeme odesílat soubor
  public
….

Další pomocné proměnné:

var
  Form1: TForm1;
  soubor: string; //uložení filename souboru
  velikost :int64; //velikost souboru

Když stiskneme tlačítko Otevři:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    if Trim(OpenDialog1.FileName) <> "" then begin
       if fileexists(OpenDialog1.FileName) then begin
          soubor := ExtractFileName(OpenDialog1.FileName); //nastavíme název souboru
          Label2.Caption := soubor; 
          Soubor_Stream := TFileStream.Create(soubor,fmOpenRead);// otevřeme soubor a uložíme do streamu
          Button2.enabled := True;
       end;
    end;
  end;
end;

Tlačítko Připojit:

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientSocket1.ClientType := ctNonBlocking;
  ClientSocket1.Port := 123456; // nastavíme port
  ClientSocket1.Address := Edit1.Text; // nastavíme IP adresu
  ClientSocket1.Active := True;
end;

Když se připojíme:

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Button3.enabled := True;
end;

Když se odpojíme:

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Button1.Enabled := True;
  Button2.Enabled := False;
  Button3.Enabled := False;
end;

Jestliže nám přichází příkazy ze serveru, tak se na ně podíváme:

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  zprava:string; //pomocná proměnná
begin
  zprava := socket.ReceiveText; //přiřadíme text, který přišel
  if zprava = "NAME ??" then begin //jestli je zpráva „NAME ??“
    socket.SendText("NAME = "+ label2.Caption); //odešleme jméno souboru
  end;

  If zprava = "SIZE ??" then begin //jestli je zpráva „SIZE ??“
    socket.SendText("SIZE = " + IntToStr(Soubor_Stream.Size)); //odešleme velikost souboru
  end;
end;

A poslední tlačítko – Odeslat:

procedure TForm1.Button3Click(Sender: TObject);
begin
     ClientSocket1.Socket.SendStream(Soubor_Stream);
end;

Tímto jsme vlastně odeslali soubor na server. Teď si ukážeme, jak server vypadá:

Snad jedinou použitou komponentou je tam memo. U něj si nastavme vlastnost ReadOnly na True. Zdrojový kód serveru:

Proměnné:

var
  Form1: TForm1;
  FStream: TFileStream; //proměnná na ukládání souboru
  cekam_na_jmeno, cekam_na_velikost:boolean; //pomocné proměnné 
  jmenoSouboru:string; //jméno souboru
  velikost_soub:int64; //velikost souboru

Po vytvoření formuláře:

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket1.ServerType := stNonBlocking; //spojení bude neblokující
  ServerSocket1.Port := 123456; //port
  ServerSocket1.Active := True; //zapneme server
  cekam_na_jmeno := false; //inicializace proměnných
  cekam_na_velikost := true; //inicializace proměnných
end;

Když se zapne server:

procedure TForm1.ServerSocket1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add("Naslouchám......."); // server ohlásí, že je připraven
end;

Při připojení klienta:

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add("Připojen: "+socket.LocalHost+"("+socket.RemoteAddress+")"); //vložíme do mema informace, kdo se k nám připojil
  socket.SendText("NAME ??"); //odešleme dotaz
  cekam_na_jmeno := true; //změníme pomocnou proměnou
end;

A teď asi nejdelší a nejsložitější část (když přijdou nějaká data na server):

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  velikost: integer; //velikost příchozích dat
  buffer: Pointer; //pomocný ukazatel
  zprava:string; //pomocná proměnná k zjištění, co přišlo za příkaz
begin
     if cekam_na_jmeno then begin// jestliže čekáme na jméno souboru
       zprava := Socket.ReceiveText; //do proměnné vložíme, co nám přišlo
       if leftStr(zprava,7) = "NAME = " then begin //jestliže to bude jméno, pak…
         jmenoSouboru := rightStr(zprava,Length(zprava)-7);//"vycucneme" název souboru z řetězce
         FStream := TFileStream.Create(jmenoSouboru,fmCreate or fmShareDenyWrite); //vytvoříme stream, kam se budou zapisovat části souboru
         cekam_na_jmeno := false;
         cekam_na_velikost := true;
         socket.SendText("SIZE ??"); //odešleme příkaz
         Memo1.Lines.Add("Jméno souboru: "+jmenosouboru);  // vypíšeme do mema jméno souboru
       end;
     end;

     if cekam_na_velikost then begin // jestliže čekáme na velikost souboru
       zprava := Socket.ReceiveText; //do proměnné vložíme, co nám přišlo
       if leftStr(zprava,7) = "SIZE = " then begin //jestliže zpráva bude začínat na „SIZE = “
         velikost_soub := StrToInt(RightStr(zprava,Length(zprava)-7)); //vycucneme velikost souboru
         cekam_na_velikost := false; //přestaneme čekat na velikost souboru
         Memo1.Lines.Add("Velikost souboru: "+IntToStr(velikost_soub)+" b");
       end;
     end;

     velikost := socket.ReceiveLength;//kolik dat jsme příjali
     GetMem(buffer,velikost);//alokujeme paměť

     try
       socket.ReceiveBuf(buffer^,velikost); //do bufferu uložíme to, co nám přišlo
       FStream.Write(buffer^, velikost); // a zapíšeme do souboru
     finally
       FreeMem(buffer); //uvolníme paměť
     end;

     if velikost_soub = FStream.Size then begin
        Memo1.Lines.Add("Posílání souboru ukončeno");
        ServerSocket1.Active := false; // vypneme server a tím docílíme odpojení klienta
        Memo1.Lines.Add("Server neaktivní"); //zapíšeme do mema
        ServerSocket1.Active := true;// zapneme server
        FStream.Free;// uvolníme proměnnou
     end;

end;

Toto je celé. Snažil jsem se popsat vše, co by mohlo být nesrozumitelné, ale myslím si, že teď to snad pochopí i průměrně zkušený programátor v Delphi.

Prosím, nepište do komentářů, že například tento kód není správný:

socket.ReceiveBuf(buffer^,velikost); //do bufferu uložíme to, co nám přišlo

Mělo tam být, že do pointeru buffer se uloží adresa na data, ale chtěl jsem to udělat tak, aby to opravdu pochopil skoro každý. To je pro tento díl vše.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Autor programoval v Visual Basicu, Delphi, nyní jen v Jave!

Nové články

Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Reklama
Reklama
Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý