programatori novice (eu, când am început să învăț Delphi), se întreabă cum de a transfera un fișier prin prize, cu excepția cazului în cazul în care acest fișier este trecut prin priza este încă o mulțime de informații. Se pare că problema nu este atât de complicată, dar nu este ușor. După o căutare lungă pe Internet, nu am găsit niciodată un articol util pe această temă. Așa că am decis să rezolv acest defect, iar în acest articol voi încerca să ajut la rezolvarea acestei probleme.
Să scriem un program care să poată transfera fișiere prin socket-uri (client și server) și alte comenzi, de exemplu, un mesaj. Clientul va primi fișiere sau comenzi și serverul va trimite. În cazul în care clientul va fi tot într-o înregistrare rând în tampon, apoi, în plus față de dosar, nu va fi și echipa, și trebuie să facem astfel încât fișierele și comenzi în nici un caz nu s-au îmbinat. Cu toate acestea trebuie să ia în considerare faptul că, dacă un fișier mare este în tranzit, se va reduce în mai multe pachete, care este, transmite fișierul nu este în același pachet, dar câteva, și OnClientRead eveniment va fi numit de mai multe ori. Aceasta este principala problemă a transmisiei!
Pentru a putea să se separe comenzile din dosar, primul va trimite clientului o linie de genul: „fișier # fisier.txt # 16“, adică: comanda + separator + numele fișierului + separator + dimensiunea fișierului.
La primirea acestei comenzi, clientul va intra în modul de primire a fișierelor și totul va fi scris în tampon, până când dimensiunea fișierului este egală cu dimensiunea datelor recepționate. În acest fel, clientul va separa comenzile de fișier!
Și așa vom proceda pentru a scrie codul:
Să începem cu serverul (acesta va trimite fișierul):
Plasați următoarele componente pe formularul: TServerSocket, TButton, TEdit, TProgressBar și TStatiusBar. Aranjați-le așa cum se arată în imagine.
Instalați componenta TServerSocket, port: 1001.
Setați componenta TStatusBar, variabila SimplePanel la true.
În linie. se introduce numele fișierului pentru transfer, butonul TButton este utilizat pentru a transfera fișierul.
Mai întâi, adăugați un tampon pentru fișierul la variabilele globale:
Acum, să facem socket-ul deschis atunci când creăm formularul:
La sfârșitul aplicației nu trebuie să uitați să închideți soclul:
Apăsarea butonului trimite fișierul:
La evenimentul OnClientRead, componenta TServerSocket, introduceți următorul cod:
Acest lucru este necesar pentru ca serverul să omoare tamponul, numai după ce clientul primește fișierul. Dacă ucizi tamponul, imediat după fișierul de transfer, clientul nu va avea timp să primească întregul fișier. Imediat ce clientul acceptă fișierul, va trimite comanda "end" la server, ceea ce înseamnă că fișierul este acceptat și serverul va ucide tamponul.
Acum, permiteți serverului nostru să afișeze câteva informații despre conexiune:
La evenimentul OnClientConnect, componenta TServerSocket, introduceți următorul cod:
Și pentru evenimentul OnClientDisconnect, introduceți:
Iată serverul și este gata. Acum du-te la client (este fișierul) cu PIM tam-tam va fi mai mult:
Declarați variabilele și procedura odu. Scrieți variabilele private. altfel nimic nu va funcționa:
În cazul evenimentului de creare a formularului, ne conectăm la server și așteptăm transferul fișierului:
La sfârșitul aplicației, închideți soclul:
Deci, ca și serverul, permiteți clientului să dea informații despre conexiune:
Acum trebuie să introduceți codul în procedura de scriere. Această procedură este necesară pentru a se asigura că datele primite sunt scrise într-un fișier. Codul de procedură:
Acum, la evenimentul OnClientRead al componentei TClientSocket, introduceți următorul cod:
Astfel, în cazul în care un fișier mare, iar evenimentul OnClientRead va fi numit nu o dată, ci de mai multe, apoi în cazul în care modul de recepție fișier client, acesta va înregistra datele în buffer, iar dacă nu, atunci clientul va determina comanda primită, și dacă acel fișier, va intra în modul de primire a fișierelor. Dacă nu înțelegeți ceva, citiți codul programului, nu am dizolvat neintenționat totul :-)
Ei bine, asta e tot.
Clientul și serverul sunt gata. În primul rând, începe server și pentru client și să încerce să transfere fișiere care sunt mai multe megaocteți fara probleme :-) am trimis prin rețea de 10-12 MB fișier.
Mult noroc cu programarea!