Schéma základného nastavenia:
Tu je znázornený základný diagram nastavenia tohto programu.
Pre zjednodušenie budeme v celom článku volať Systém A ako A_client a Systém B ako B_server.
Požiadavky na súbor:
Potrebujeme server.py a tento súbor by mal byť prítomný v serverovom systéme. V našom prípade server.py by malo byť v systéme B_server.
Ďalšie dva súbory zákazník.py a vzorka.TXT by mal byť prítomný v klientskom systéme. V našom prípade by tieto dva súbory mali byť prítomné v systéme A_client.
Predpoklady:
Tu sú predpoklady:
- Mali by sme mať dva systémy Linux s terminálovým prístupom.
- Výhodná príchuť Linuxu je Ubuntu.
- Mal by byť nainštalovaný Python3.
- Oba systémy Linux by mali byť schopné navzájom sa testovať. Použite ping
príkaz na kontrolu ping. - Jeden systém by mal fungovať ako Server a druhý systém by mal fungovať ako klient v jednom konkrétnom čase.
Obmedzenia:
Než budeme pokračovať, mali by sme vedieť, že tento program má určité obmedzenia.
- Na spustenie tohto programu by mal byť nainštalovaný Python3 +. Ak sú spustené na starších verziách pythonu, môžete pozorovať chyby alebo odlišné správanie.
- Týmto programom je odteraz možné prenášať iba textové súbory. Akýkoľvek iný formátový súbor, ktorý neobsahuje text, môže zlyhať.
- V programe boli spracované základné programové výnimky.
- Program môže, ale nemusí fungovať na inom OS ako Ubuntu.
- Textový súbor by mal byť na strane klienta krátky, pretože bola použitá veľkosť vyrovnávacej pamäte 1024 bajtov.
Nastaviť požiadavky:
- Na vyskúšanie tohto programu potrebujeme aspoň jeden systém Linux. Odporúčame však použiť dva rôzne systémy Linux, ktoré sú pripojené cez sieť.
- Dva systémy by mali byť pripojené prostredníctvom siete Ethernet alebo Wi-Fi alebo akýchkoľvek iných pripojení.
Zdrojový kód servera:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / server.py
Zdrojový kód klienta:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / client.py
Ako spustiť programy a očakávaný výstup:
Tu sú kroky na vykonanie programu.
Krok 1: Choďte do systému B_server a otvorte terminál. Skratka na otvorenie terminálu je Alt + Ctrl + t.
Krok 2: Teraz choďte na cestu, kde server.py je prítomný.
Krok 3: Teraz spustite server.py ako dole
server python3.pyNemali by byť žiadne chyby a mali by ste vidieť výtlačky nižšie
Server je uvedený na porte: 9898Názov skopírovaného súboru bude recv.txt na strane servera
Krok 4: Teraz otvorte terminál v systéme A_client.
Krok 5: Choďte na cestu, kde klient.py a vzorka.txt sú prítomné.
Krok 6: Teraz spustite klienta.py ako dole
klient python3.pyZistili sme, že potrebujeme poznať adresu IP servera. Nižšie uvedený príkaz môžeme vykonať, aby sme zistili IP adresu systému B_server.
ifconfig
Teraz by mal byť výstup systému A_client taký
################### Nasledujúca správa je prijatá zo servera ####################| --------------------------------- |
Ahoj klient [IP adresa: 192.168.1.102],
** Vitajte na serveri **
-Server
| --------------------------------- |
Krok 7: Teraz choďte na B_server a vyhľadajte pod výstupom
Súbor bol úspešne skopírovanýServer ukončil spojenie
Krok 8: Mal by existovať jeden názov súboru recv.txt v priečinku servera. Obsah tohto článku.txt by mala byť rovnaká vzorka.TXT.
Takže sme úspešne skopírovali súbor z klienta na server cez sieť prostredníctvom programu python.
Vysvetlenia kódu:
Existujú dva súbory pythonu server.py a zákazník.py.
Upozorňujeme, že raz vysvetlíme, či je nejaký kód na serveri rovnaký.py a klient.py.
- server.py:
Toto je linka shebang, čo v predvolenom nastavení znamená tento server.py by mal používať python3. Pozrime sa na jednu výhodu tohto riadku.
Server sme vykonali.py alebo klient.py like python3 <.py file name>. Teraz bez použitia python3 môžeme spustiť súbor python. Postupujte podľa nižšie uvedených príkazov
Prejsť do režimu super používateľa:
suUdeľte všetkým povolenie .súbor py:
server chmod 777.pySpustiť server.py:
./ server.py import soketImport knižnice soketov do programu python, ako ideme
použiť na pripojenie zásuvku.
s = zásuvka.zásuvka ()
Vytvárame objekt „S“ na prístup ku všetkým metódam soketu. Toto je koncept OOP.
PORT = 9898Teraz sme vybrali jeden port, na ktorom bude server počúvať. Namiesto toho môžeme použiť nevyhradený port.
s.väzba ((", PORT))Na naviazanie adresy IP servera na tento port používame metódu viazania [9898]. Jedným z postrehov je, že sme mohli použiť presnú IP adresu servera namiesto prvého argumentu metódy bind, ale necháme to prázdne, pretože to funguje dobre.
s.väzba ((IP adresa, PORT))file = open ("recv.txt "," wb ")
Otvorili sme jeden názov súboru „recv.txt ”na serveri pre režim zápisu a dostal ukazovateľ súboru. Toto je potrebné, pretože musíme skopírovať jeden textový súbor z klienta.
zatiaľ čo je pravda:Začnime jednu nekonečnú slučku while, pretože úlohou servera je počkať, kým klient nekomunikuje so serverom na tomto porte 9898. Je teda potrebná slučka while.
conn, addr = s.súhlasiť()Tento kód slúži na prijatie akejkoľvek prichádzajúcej žiadosti o pripojenie od klienta. Conn použije „podvádzať “ komunikovať s klientom a „Addr“ je IP adresa klienta, ktorý odoslal požiadavku na rozruch na tento server na porte 9898.
msg = "\ n \ n | --------------------------------- | \ n Ahoj klient [IP adresa:"+ addr [0] +"], \ n ** Vitajte na serveri ** \ n -Server \ n
| --------------------------------- | \ n \ n \ n "
Tento kód slúži na vytvorenie správy, ktorá sa má poslať klientovi. Táto správa by mala byť vytlačená na klientskom termináli. To potvrdzuje, že klient je schopný komunikovať so serverom.
prip.odoslať (správa.kódovať ())Teraz máme správu pripravenú a potom ju pomocou toho pošleme klientovi „Conn“. Tento kód skutočne odošle správu klientovi.
RecvData = spoj.recv (1024)Tento kód prijíma všetky údaje odosielané zo strany klienta. V našom prípade očakávame obsah vzorky.txt v „RecvData“.
zatiaľ čo RecvData:Ešte jedna slučka while s podmienkou RecvData nie je prázdna. V našom prípade to nie je prázdne.
spis.zápis (RecvData)Keď už máme obsah vnútri „RecvData“ potom píšeme do toho súboru „Rekv.TXT" pomocou ukazovateľa súboru „Súbor“.
RecvData = spoj.recv (1024)Opäť sa snažím prijímať, ak existujú nejaké údaje od klienta. Raz „RecvData“ nemá žiadne údaje, kód preruší cyklus while.
spis.Zavrieť()Týmto sa iba zavrie ukazovateľ súboru, tak ako to robíme pri zápise súborov.
prip.Zavrieť()Týmto sa ukončí spojenie s klientom.
prestávkaTo má vyjsť z nekonečnej while cyklu na B_server.
- zákazník.py:
Import knižnice sys, ako chceme, využíva argumentačné zariadenie v pythone.
ak (len (sys.argv)> 1):ServerIp = sys.argv [1]
inak:
print ("\ n \ n Spustiť ako \ n klient python3.py < serverip address > \ n \ n ")
výstup (1)
Ako sme odovzdali IP adresu B_servera za menom klienta.py, keď je spustený, musíme zachytiť adresu IP tohto servera v klientovi.
… If (len (sys.argv)> 1): => Aby sa ubezpečil, že používateľ predá aspoň jeden argument ako adresu IP a zachytí túto adresu IP insdie „ServerIP“.
Ak užívateľ nesplní aspoň jeden argument, zobrazí kód pomoc a vychádza z kódu.
PORT = 9898Musí to byť rovnaký port, aký je uvedený na strane B_server.
s.pripojiť ((ServerIp, PORT))Tento kód vykoná pripojenie TCP k serveru IP pomocou tohto portu. Čokoľvek zlé na tomto náznaku má za následok zlyhanie spojenia.
file = open ("vzorka.txt "," rb ")Otvárame „ukážku.txt ”v režime čítania na čítanie iba obsahu.
SendData = súbor.prečítané (1024)Čítanie obsahu súboru a vloženie dovnútra “SendData ” premenná.
zatiaľ čo SendData:Začíname slučku while while, ak „SendData ” má údaje. V našom prípade ak „ukážka.txt ”nie je prázdny, mal by mať údaje.
s.poslať (SendData)Teraz môžeme posielať obsah „Ukážka.TXT" na server pomocou objektu soketu „S“.
SendData = súbor.prečítané (1024)Opäť čítanie, či ešte niečo zostáva. Zo súboru teda nebude nič čo čítať „SendData“ bude prázdny a vyjde z cyklu while.
s.Zavrieť()Nejde o ukončenie spojenia zo strany klienta.
Screenshoty na strane servera
Screenshoty Ubuntu Strana klienta
Testované kombinácie:
- Linux ako server a Linux ako klient: PASS
- Linux ako klient a Linux ako server: PASS
- Linux ako server a Windows10 ako klient: PASS
- Linux ako klient a Windows10 ako server: PASS
Odporúčanie je použiť dva systémy Linux pre server a klienta.
Očakávané chyby:
- Ak server nebeží na porte 9898, môžete vidieť nasledujúcu chybu
Traceback (posledný posledný hovor):
Spisový klient.py ", linka 22, vs.pripojiť ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Pripojenie odmietnuté
- Nižšie uvedená chyba sa zobrazí, ak adresa IP nie je odovzdaná na strane klienta
Bežte ako
klient python3.py < serverip address >- Nižšie je uvedená chyba, ak 1sv argumentom na strane klienta nie je IP adresa
Traceback (posledný posledný hovor):
Spisový klient.py ", linka 22, vs.pripojiť ((ServerIp, PORT))
zásuvka.gaierror: [Errno -2] Názov alebo služba nie sú známe
- Nižšia chyba je viditeľná, ak sa port používa ako 98980
Traceback (posledný posledný hovor):
Spisový klient.py ", linka 22, vs.pripojiť ((ServerIp, PORT))
OverflowError: getsockaddrarg: port musí byť 0-65535.
- Nižšie je uvedená chyba, ak „ukážka.txt ”sa nenachádza na strane klienta.
Traceback (posledný posledný hovor):
Spisový klient.py ", riadok 25, vfile = open ("vzorka.txt "," rb ")
FileNotFoundError: [Errno 2] Žiadny takýto súbor alebo adresár: 'ukážka.TXT'
Záver:
Pomocou tohto programu môžeme poslať jednoduchý textový súbor z jedného systému do iného systému prostredníctvom siete pomocou programu python. Toto nám dáva základné osvojenie programovania pythonu a socketu aj pre odosielanie dát cez sieť.