Odosielanie prenosu súborov so zásuvkou Python

Python Socket File Transfer Send



Cieľom tohto článku je naučiť sa ako preniesť textový súbor cez sieť prostredníctvom programu python . Tento prenos súborov je založený na modeli serverového klienta na používanie soketového programovania v python3+.

Tu je diagram základného nastavenia na spustenie tohto programu.









Pre zjednodušenie budeme v celom článku nazývať 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 mal byť v systéme B_server.





Ďalšie dva súbory client.py a sample.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.
  • Preferovaná verzia Linuxu je Ubuntu .
  • Mal by byť nainštalovaný Python3.
  • Oba systémy Linux by sa mali navzájom pingovať. 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:

Predtým, ako budeme pokračovať, by sme mali vedieť, že tento program má určité obmedzenia.

  • Na spustenie tohto programu by mal byť nainštalovaný Python3+. Pri spustení v starších verziách systému Python môže dôjsť k chybe alebo odlišnému správaniu.
  • Prostredníctvom tohto programu je teraz 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é výnimky z programovania.
  • Program môže, ale nemusí bežať 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úča sa však použiť dva rôzne systémy Linux, ktoré sú prepojené sieťou.
  • Dva systémy by mali byť prepojené cez ethernet alebo Wi-Fi alebo akékoľvek iné pripojenia.

Serverový zdrojový kód:

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 spustenie programu.

Krok 1: Prejdite do systému B_server a otvorte terminál. Skratka na otvorenie terminálu je Alt+Ctrl+t.

Krok 2: Teraz prejdite na cestu, kde je server.py.

Krok 3: Teraz spustite server.py ako nižšie

server python3.py

Nemalo by dôjsť k žiadnym chybám a nižšie by ste mali vidieť výtlačky

Server je uvedený na porte: 9898

Skopírovaný názov súboru bude recv.txt na strane servera

Krok 4: Teraz otvorte terminál v systéme A_client.

Krok 5: Prejdite na cestu, kde sa nachádzajú súbory client.py a sample.txt.

Krok 6: Teraz spustite client.py ako nižšie

klient python3.py <B_serverový systém IP>

Zistili sme, že potrebujeme poznať IP adresu servera. Nasledujúcim príkazom môžeme zistiť 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 prejdite na server B_server a vyhľadajte nižšie uvedený výstup

Súbor bol úspešne skopírovaný
Server ukončil pripojenie

Krok 8: V priečinku servera by mal byť jeden názov súboru recv.txt. Obsah tohto súboru recv.txt by mal byť rovnaký ako sample.txt.

Úspešne sme teda skopírovali súbor z klienta na server cez sieť prostredníctvom programu python.

Vysvetlenia kódu:

Existujú dva pythonové súbory server.py a client.py .

Všimnite si toho, že raz vysvetlíme, či je nejaký kód v serveri.py a klient.py rovnaký.

  1. server.py:
#!/usr/bin/env python3

Toto je riadok shebang, čo znamená, že v predvolenom nastavení by tento server.py mal používať python3. Pozrime sa na jednu výhodu tohto riadku.

Vykonali sme server.py alebo client.py ako python3. Teraz bez použitia python3 môžeme spustiť súbor python. Postupujte podľa nižšie uvedených príkazov

Prejdite do super užívateľského režimu:

jeho

Udeliť všetky povolenia súboru .py:

chmod777server.py

Spustite server.py:

./server.py import zásuvka
Importzásuvkaknižnica do programu pythonakoideme
použitzásuvka prepripojenie.

s = zásuvka.zásuvka()

Vytvárame objekt s prístup k všetkým metódam zásuvky. Toto je koncept OOP.

PORT= 9898

Teraz vyberieme jeden port, na ktorom bude server počúvať. Namiesto toho môžeme použiť nevyhradený port.

s.zaviazať(('',PORT))

Na viazanie ip adresy servera na tento port používame metódu bind [9898]. Jedným z pozorovaní je, že sme mohli použiť presnú IP adresu servera namiesto prvého argumentu metódy väzby, ale rozhodli sme sa nechať pole prázdne, pretože to funguje dobre.

s.zaviazať((IP adresa,PORT))
súbor = otvorené('recv.txt', 'wb')

Na serveri sme pre režim zápisu otvorili jeden názov súboru recv.txt a získali sme ukazovateľ súboru. Je to potrebné, pretože musíme skopírovať jeden textový súbor z klienta.

kým Pravda:

Začnime jednou nekonečnou slučkou, pretože úlohou servera je počkať, kým klient nebude komunikovať so serverom na tomto porte 9898. Takže táto slučka je potrebná.

spoj,addr=s.súhlasiť()

Tento kód má prijať akúkoľvek prichádzajúcu požiadavku na pripojenie od klienta. Conn použije spoj komunikovať s klientom a addr je IP adresa klienta, ktorý odoslal požiadavku na rozrušenie tomuto serveru na porte 9898.

správa= ' n n| --------------------------------- | nAhoj klient [IP adresa:
'
+ addr[0]+'], n** Vitajte na serveri ** n-Server n
| --------------------------------- | n n n'

Tento kód má vytvoriť správu, ktorá sa má odoslať klientovi. Táto správa by mala byť vytlačená na klientskom termináli. Toto potvrdzuje, že klient je schopný komunikovať so serverom.

spoj.poslať(správazakódovať())

Teraz máme správu pripravenú a potom ju odošleme klientovi spoj. Tento kód v skutočnosti odosiela správu klientovi.

RecvData=spoj.recv(1024)

Tento kód prijíma všetky údaje odoslané z klientskej strany. V našom prípade očakávame obsah súboru sample.txt v RecvData .

kýmRecvData:

Ešte jedna slučka while s podmienkou RecvData nie je prázdna. V našom prípade nie je prázdny.

súbor.písať(RecvData)

Akonáhle budeme mať obsah vo vnútri RecvData potom napíšeme do tohto súboru recv.txt pomocou ukazovateľa súboru súbor.

RecvData=spoj.recv(1024)

Znova sa pokúšam prijať, ak existujú nejaké údaje od klienta. Raz RecvData nemá žiadne údaje, kód preruší slučku while.

súbor.Zavrieť()

Týmto sa zavrie ukazovateľ súboru, keď sme s zápisom súborov skončili.

spoj.Zavrieť()

Tým sa ukončí spojenie s klientom.

prestávka

Toto má vyjsť z nekonečnej slučky na B_serveri.

  1. client.py:
import sys

Import knižnice sys, ako chceme, používa argumentačnú funkciu v pythone.

keby (len(sys.argv) > 1):
ServerIp= sys.argv[1]
inak:
vytlačiť(' n nBež ako npython3 client.py n n')
východ(1)

Keď za chodu odovzdávame IP adresu servera B_server za názvom súboru client.py, musíme zachytiť IP adresu servera vo vnútri klienta.

… ..If (len (sys.argv)> 1): => Aby ste sa uistili, že používateľ zadá ako IP adresu aspoň jeden argument a zachytí túto IP adresu ServerIP.

Ak používateľ neprejde aspoň jedným kódom argumentu, zobrazí sa pomoc a vyjde z kódu.

PORT= 9898

Musí to byť rovnaký port, ako je uvedené na strane B_servera.

s.pripojiť((ServerIp,PORT))

Tento kód vykoná pripojenie TCP k serveru IP s týmto portom. Čokoľvek zlé v tomto bode má za následok zlyhania v spojení.

súbor = otvorené('sample.txt', 'rb')

Otvárame súbor sample.txt v režime čítania, aby sme mohli čítať iba obsah.

SendData= súbor.čítať(1024)

Čítanie obsahu súboru a vkladanie dovnútra SendData premenná.

kýmOdoslať údaje:

Začíname jeden while, ak SendData má údaje. V našom prípade, ak sample.txt nie je prázdny, mal by obsahovať údaje.

s.poslať(SendData)

Teraz môžeme odoslať obsah sample.txt na server pomocou objektu socket s.

SendData= súbor.čítať(1024)

Ešte raz si prečítajte, či ešte niečo zostalo. Zo súboru teda nebude čo čítať SendData bude prázdny a bude vychádzať zo slučky while.

s.Zavrieť()

Toto nie je uzavretie pripojenia z klientskej strany.

Snímky obrazovky Ubuntu Strana servera

Snímky obrazovky Ubuntu na strane klienta

Testované kombinácie:

  • Linux ako server a Linux ako klient: PASS
  • Linux ako klient a Linux ako server: PASS
  • Linux ako server a Windows 10 ako klient: PASS
  • Linux ako klient a Windows 10 ako server: PASS

Odporúča sa používať dva systémy Linux pre server a klienta.

Očakávané chyby:

  1. Ak server nie je spustený na porte 9898, nižšie vidíte chybu

Traceback (posledný hovor naposledy):

Súbor'client.py',riadok22, v <modul>
s.pripojiť((ServerIp,PORT))
ConnectionRefusedError:[Errno111]spojenie zamietnuté
  1. Ak nie je adresa IP odoslaná na strane klienta, zobrazí sa chyba nižšie

Bež ako

klient python3.py <adresa servera>
  1. Nasledujúca chyba sa zobrazí, ak 1svargument na strane klienta nie je IP adresa

Traceback (posledný hovor naposledy):

Súbor'client.py',riadok22, v <modul>
s.pripojiť((ServerIp,PORT))
zásuvka.gaierror:[Errno -2]názovaleboslužbanieznámy
  1. Nasledujúca chyba sa zobrazuje, ak sa port používa ako 98980

Traceback (posledný hovor naposledy):

Súbor'client.py',riadok22, v <modul>
s.pripojiť((ServerIp,PORT))
OverflowError: getsockaddrarg: port musí byť0-65535.
  1. Ak vzorka.txt nie je na strane klienta, zobrazí sa chyba nižšie.

Traceback (posledný hovor naposledy):

Súbor'client.py',riadok25, v <modul>
súbor = otvorené('sample.txt', 'rb')
FileNotFoundError:[Errno2]Nič takésúbor aleboadresár:'sample.txt'

Záver:

Pomocou tohto programu môžeme odoslať jednoduchý textový súbor z jedného systému do druhého systému prostredníctvom siete pomocou programu python. To nám dáva základné znalosti o programovaní v pythone a sokete aj na odosielanie údajov cez sieť.