Odeslání přenosu souborů Python Socket

Python Socket File Transfer Send



Cílem tohoto článku je naučit se jak přenášet textový soubor přes síť prostřednictvím programu python . Tento přenos souborů je založen na modelu klientského serveru pro použití soketového programování v pythonu3+.

Zde je základní schéma nastavení pro spuštění tohoto programu.









Pro zjednodušení budeme v celém článku nazývat Systém A jako A_client a Systém B jako B_server.



Požadavky na soubor:

Potřebujeme server.py a tento soubor by měl být přítomen v serverovém systému. V našem případě by server.py měl být v systému B_server.





Další dva soubory client.py a sample.txt by měl být přítomen v klientském systému. V našem případě by tyto dva soubory měly být přítomny v systému A_client.

Předpoklady:

Zde jsou předpoklady:



  • Měli bychom mít dva systémy Linux s přístupem k terminálu.
  • Preferovaná příchuť Linuxu je Ubuntu .
  • Měl by být nainstalován Python3.
  • Oba systémy Linux by se měly navzájem pingovat. Použití ping příkaz ke kontrole ping.
  • Jeden systém by měl fungovat jako Server a druhý systém by měl fungovat jako klient v jednom konkrétním čase.

Omezení:

Než budeme pokračovat dále, měli bychom vědět, že tento program má určitá omezení.

  • Ke spuštění tohoto programu by měl být nainstalován Python3+. Pokud používáte starší verze pythonu, můžete zaznamenat chybu nebo jiné chování.
  • Prostřednictvím tohoto programu lze nyní přenášet pouze textový soubor. Jakýkoli jiný formátový soubor, který neobsahuje text, může selhat.
  • V programu byly zpracovány základní výjimky z programování.
  • Program může, ale nemusí běžet na jiném OS než Ubuntu.
  • Textový soubor by měl být na straně klienta krátký, protože byla použita velikost vyrovnávací paměti 1024 bajtů.

Nastavit požadavky:

  • K vyzkoušení tohoto programu potřebujeme alespoň jeden systém Linux. Doporučuje se však použít dva různé systémy Linux, které jsou propojeny sítí.
  • Dva systémy by měly být propojeny ethernetem nebo Wi-Fi nebo jakýmkoli jiným připojením.

Zdrojový kód serveru:

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

Jak spouštět programy a očekávaný výstup:

Zde jsou kroky ke spuštění programu.

Krok 1: Přejděte do systému B_server a otevřete terminál. Zkratka pro otevření terminálu je Alt+Ctrl+t.

Krok 2: Nyní přejděte na cestu, kde je server.py přítomen.

Krok 3: Nyní spusťte server.py jako níže

server python3.py

Nemělo by dojít k žádným chybám a výtisky byste měli vidět níže

Server je uveden na portu: 9898

Název zkopírovaného souboru bude recv.txt na straně serveru

Krok 4: Nyní otevřete terminál v systému A_client.

Krok 5: Přejděte na cestu, kde jsou přítomny soubory client.py a sample.txt.

Krok 6: Nyní spusťte client.py jako níže

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

Zjistili jsme, že potřebujeme znát IP adresu serveru. Můžeme provést níže uvedený příkaz, abychom poznali IP adresu systému B_server.

ifconfig

Nyní by měl výstup systému A_client vypadat takto

#################### Níže je ze serveru přijata zpráva ####################
| --------------------------------- |
Ahoj kliente[IP adresa: 192.168.1.102],
** Vítejte na serveru **
-Server
| --------------------------------- |

Krok 7: Nyní přejděte na B_server a podívejte se na níže uvedený výstup

Soubor byl úspěšně zkopírován
Server ukončil připojení

Krok 8: Ve složce serveru by měl být jeden název souboru recv.txt. Obsah tohoto souboru recv.txt by měl být stejný sample.txt.

Úspěšně jsme tedy zkopírovali soubor z klienta na server přes síť prostřednictvím programu python.

Vysvětlení kódu:

Existují dva soubory pythonu server.py a client.py .

Všimněte si, že jednou vysvětlíme, jestli je nějaký kód uvnitř server.py a client.py stejný.

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

Toto je řádek shebang, což znamená, že ve výchozím nastavení by tento server.py měl používat python3. Podívejme se na jednu výhodu této řady.

Spustili jsme server.py nebo client.py jako python3. Nyní bez použití python3 můžeme spustit soubor python. Postupujte podle níže uvedených příkazů

Přejít do superuživatelského režimu:

své

Udělte všechna oprávnění souboru .py:

chmod777server.py

Spusťte server.py:

./server.py import zásuvka
Importzásuvkaknihovna do programu pythontak jakojdeme
použítzásuvka prospojení.

s = zásuvka.zásuvka()

Vytváříme objekt s pro přístup ke všem metodám soketu. Toto je koncept OOP.

PŘÍSTAV= 9898

Nyní vybereme jeden port, kde bude server naslouchat. Místo toho můžeme použít nevyhrazený port.

s.svázat(('',PŘÍSTAV))

K navázání IP adresy serveru na tento port používáme metodu bind [9898]. Jedním z pozorování je, že jsme mohli použít přesnou IP adresu serveru namísto prvního argumentu metody vazby, ale rozhodli jsme se nechat prázdné, protože to funguje dobře.

s.svázat((IP adresa,PŘÍSTAV))
soubor = otevřeno('recv.txt', 'wb')

Otevřeli jsme jeden název souboru recv.txt na serveru pro režim zápisu a získali jsme ukazatel souboru. Je to nutné, protože musíme zkopírovat jeden textový soubor z klienta.

zatímco Skutečný:

Začněme jednou nekonečnou smyčkou, zatímco úkolem serveru je počkat, dokud klient nebude komunikovat se serverem na tomto portu 9898. Takže je vyžadována smyčka while.

spoj,addr=s.přijmout()

Tento kód má přijmout jakýkoli příchozí požadavek na připojení od klienta. Conn použije spoj komunikovat s klientem a addr je IP adresa klienta, který na server odeslal požadavek na rozruch na portu 9898.

zpráva= ' n n| --------------------------------- | nAhoj kliente [IP adresa:
'
+ adresa[0]+'], n** Vítejte na serveru ** n-Server n
| --------------------------------- | n n n'

Tento kód má vytvořit zprávu pro odeslání klientovi. Tato zpráva by měla být vytištěna na klientském terminálu. To potvrzuje, že klient je schopen komunikovat se serverem.

spoj.poslat(zprávazakódovat())

Nyní máme zprávu připravenou a poté ji odešleme klientovi spoj. Tento kód ve skutečnosti odesílá zprávu klientovi.

RecvData=spoj.recv(1024)

Tento kód přijímá veškerá data odesílaná ze strany klienta. V našem případě očekáváme obsah souboru sample.txt v RecvData .

zatímcoRecvData:

Ještě jedna smyčka while s podmínkou RecvData není prázdná. V našem případě není prázdný.

soubor.napsat(RecvData)

Jakmile budeme mít obsah uvnitř RecvData pak píšeme do toho souboru recv.txt pomocí ukazatele na soubor soubor.

RecvData=spoj.recv(1024)

Znovu se pokusím přijmout, pokud jsou nějaká data od klienta. Jednou RecvData nemá žádná data, kód přeruší cyklus while.

soubor.zavřít()

Tím se zavře ukazatel souboru, když jsme hotovi se zápisem souboru.

spoj.zavřít()

Tím se uzavře spojení s klientem.

přestávka

To má vyjít z nekonečné smyčky na B_serveru.

  1. client.py:
import sys

Importujeme knihovnu sys, jak chceme, v Pythonu použít argument.

-li (jen(sys.argv) > 1):
ServerIp= sys.argv[1]
jiný:
tisk(' n nBěh jako npython3 client.py n n')
výstup(1)

Když předáváme IP adresu B_serveru za názvem souboru client.py za běhu, musíme zachytit IP adresu serveru uvnitř klienta.

… ..If (len (sys.argv)> 1): => Aby bylo zajištěno, že uživatel předá jako IP adresu alespoň jeden argument a zachytí tuto IP adresu ServerIP.

Pokud uživatel nepředá alespoň jeden kód argumentu, zobrazí nápovědu a vyjde z kódu.

PŘÍSTAV= 9898

Musí to být stejný port, jak je uvedeno na straně B_serveru.

s.připojit((ServerIp,PŘÍSTAV))

Tento kód provede připojení TCP k serveru IP s tímto portem. Cokoli špatného v tomto bodě má za následek selhání spojení.

soubor = otevřeno('sample.txt', 'rb')

Otevíráme sample.txt v režimu čtení, abychom mohli číst pouze obsah.

Odeslat data= soubor.číst(1024)

Přečtení obsahu souboru a vložení dovnitř Odeslat data proměnná.

zatímcoOdeslat údaje:

Začínáme jeden while, pokud Odeslat data má data. V našem případě, pokud sample.txt není prázdný, měl by obsahovat data.

s.poslat(Odeslat data)

Nyní můžeme odeslat obsah sample.txt na server pomocí objektu socket s.

Odeslat data= soubor.číst(1024)

Znovu čtěte, jestli ještě něco zbývá. Ze souboru tedy nebude co číst Odeslat data bude prázdné a vyjde ze smyčky while.

s.zavřít()

Toto není uzavření připojení ze strany klienta.

Snímky obrazovky Ubuntu Strana serveru

Snímky obrazovky Ubuntu Strana klienta

Testované kombinace:

  • Linux jako server a Linux jako klient: PASS
  • Linux jako klient a Linux jako server: PASS
  • Linux jako server a Windows10 jako klient: PASS
  • Linux jako klient a Windows 10 jako server: PASS

Doporučujeme použít dva systémy Linux pro server a klienta.

Očekávané chyby:

  1. Pokud server neběží na portu 9898, můžete vidět níže uvedenou chybu

Traceback (poslední hovor poslední):

Soubor'client.py',čára22, v <modul>
s.připojit((ServerIp,PŘÍSTAV))
ConnectionRefusedError:[Errno111]Spojení odmítnuto
  1. Pokud není na straně klienta předána adresa IP, zobrazí se níže uvedená chyba

Běh jako

klient python3.py <adresa serveru>
  1. Níže uvedená chyba je vidět, pokud 1Svatýargument na straně klienta není IP adresa

Traceback (poslední hovor poslední):

Soubor'client.py',čára22, v <modul>
s.připojit((ServerIp,PŘÍSTAV))
zásuvka.gaierror:[Errno -2]názevneboservisneznámý
  1. Níže uvedená chyba je vidět, pokud je port používán jako 98980

Traceback (poslední hovor poslední):

Soubor'client.py',čára22, v <modul>
s.připojit((ServerIp,PŘÍSTAV))
OverflowError: getsockaddrarg: port musí být0-65535.
  1. Níže uvedená chyba je vidět, pokud sample.txt není na straně klienta.

Traceback (poslední hovor poslední):

Soubor'client.py',čára25, v <modul>
soubor = otevřeno('sample.txt', 'rb')
FileNotFoundError:[Errno2]Žádný takovýsoubor neboadresář:'sample.txt'

Závěr:

Pomocí tohoto programu můžeme poslat jednoduchý textový soubor z jednoho systému do jiného systému prostřednictvím sítě pomocí programu python. To nám umožňuje základní učení programování v pythonu a soketu také pro odesílání dat po síti.