Krajta

Python Socket File Transfer Odeslat

Python Socket File Transfer Odeslat
Záměrem tohoto článku je naučit se jak přenést textový soubor po síti prostřednictvím programu python. Tento přenos souborů je založen na modelu klienta serveru k použití programování soketu v python3+.

Základní schéma nastavení:

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 soubory:

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

Další dva soubory klient.py a vzorek.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:

Omezení:

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

Nastavit požadavky:

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 spustit programy a očekávaný výstup:

Zde jsou kroky k provedení programu.

Krok 1: Přejděte na systém 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 server.py je přítomen.

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

server python3.py

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

Server vypisuje na port: 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řejít na cestu, kde klient.py a vzorek.txt jsou přítomny.

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

klient python3.py

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

ifconfig

Nyní by měl být výstup systému A_client takový

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

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

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

Krok 8: Mělo by existovat jedno jméno souboru recv.txt ve složce serveru. Obsah tohoto rekv.txt by měl být stejný vzorek.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 serveru.py a klient.py.

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

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

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

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

Přejít do režimu super uživatele:

su

Dát veškerá povolení .py soubor:

server chmod 777.py

Spustit server.py:

./ server.py importovací zásuvka
Import knihovny soketů do programu python, jak jdeme
použít zásuvku pro připojení.
s = zásuvka.zásuvka()

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

PORT = 9898

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

s.svázat ((", PORT))

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 bind, ale rozhodli jsme se ponechat prázdné, protože to funguje dobře.

s.svázat ((IP adresa, PORT))
file = open ("recv.txt "," wb ")

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

zatímco je pravda:

Začněme jednu nekonečnou smyčku while, protože úkolem serveru je počkat, dokud klient nekomunikuje se serverem na tomto portu 9898. Je tedy vyžadována smyčka while.

conn, addr = s.akceptovat()

Tento kód slouží k přijetí jakéhokoli příchozího požadavku na připojení od klienta. Conn použije „hej “ komunikovat s klientem a „Addr“ je IP adresa klienta, který odeslal požadavek na zmatek tomuto serveru na portu 9898.

msg = "\ n \ n | --------------------------------- | \ n Ahoj kliente [IP adresa:
"+ addr [0] +"], \ n ** Vítejte na serveru ** \ n -Server \ n
| --------------------------------- | \ n \ n \ n "

Tento kód slouží k vytvoření zprávy k 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.odeslat (zpráva.zakódovat())

Nyní máme zprávu připravenou a poté ji pošleme klientovi „Připojit“. 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 vzorku.txt dovnitř „RecvData“.

zatímco RecvData:

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

soubor.zápis (RecvData)

Jakmile budeme mít obsah uvnitř „RecvData“ pak píšeme do tohoto souboru "Recv.".txt “ pomocí ukazatele souboru "soubor".

RecvData = spoj.recv (1024)

Znovu se pokouší přijímat, pokud existují nějaká data od klienta. Jednou „RecvData“ nemá žádná data, kód rozbije smyčku while.

soubor.zavřít()

Tím se zavře pouze ukazatel souboru, jak to děláme se zápisem souboru.

spoj.zavřít()

Tím se ukončí spojení s klientem.

přestávka

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

  1. klient.py:
import sys

Import knihovny sys, jak chceme, použijte argumentační zařízení v pythonu.

if (len (sys.argv)> 1):
ServerIp = sys.argv [1]
jiný:
print ("\ n \ n Spustit jako \ n klient python3.py < serverip address > \ n \ n ")
výstup (1)

Jak předáváme IP adresu B_serveru za jménem klienta.py při běhu, musíme zachytit IP adresu serveru uvnitř klienta.

… If (len (sys.argv)> 1): => Chcete-li se ujistit, že uživatel předá alespoň jeden argument jako adresu IP a tuto IP adresu zachytí „ServerIP“.

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

PORT = 9898

Musí to být stejný port, jaký je uveden na straně B_server.

s.připojit ((ServerIp, PORT))

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

file = open ("ukázka.txt "," rb ")

Otevíráme „ukázku.txt ”v režimu čtení pro čtení pouze obsahu.

SendData = soubor.přečíst (1024)

Čtení obsahu souboru a vložení dovnitř “Odeslat data “ proměnná.

zatímco SendData:

Začínáme smyčku while while, když „Odeslat data “ má data. V našem případě pokud „vzorek.txt ”není prázdný, měl by mít data.

s.odeslat (SendData)

Nyní můžeme odeslat obsah "vzorek.txt “ na server pomocí objektu soketu „S“.

SendData = soubor.přečíst (1024)

Znovu číst, jestli tam ještě něco je. Ze souboru tedy nebude co číst „SendData“ bude prázdný a vyjde ze smyčky while.

s.zavřít()

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

Screenshoty na straně serveru

Screenshoty Ubuntu Na straně 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 Windows10 jako server: PASS

Doporučuje se 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 "klient.py ", řádek 22, v
s.připojit ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Připojení odmítnuto
  1. Níže uvedená chyba se zobrazí, pokud adresa IP není předána na straně klienta

Běž jako

klient python3.py < serverip address >
  1. Níže uvedená chyba se zobrazí, pokud 1Svatý argument na straně klienta není IP adresa

Traceback (poslední hovor poslední):

Soubor "klient.py ", řádek 22, v
s.připojit ((ServerIp, PORT))
zásuvka.gaierror: [Errno -2] Název nebo služba není známa
  1. Níže uvedená chyba je vidět, pokud je port používán jako 98980

Traceback (poslední hovor poslední):

Soubor "klient.py ", řádek 22, v
s.připojit ((ServerIp, PORT))
OverflowError: getsockaddrarg: port musí být 0-65535.
  1. Níže uvedená chyba se zobrazí, pokud „ukázka.txt ”není na straně klienta.

Traceback (poslední hovor poslední):

Soubor "klient.py ", řádek 25, v
file = open ("ukázka.txt "," rb ")
FileNotFoundError: [Errno 2] Žádný takový soubor nebo adresář: 'ukázka.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 dává základní učení programování pythonu a socketu také pro odesílání dat po síti.

Jak obrátit směr posouvání myši a touchpadu ve Windows 10
Myš a Touchpadnejenže usnadňují výpočet, ale jsou efektivnější a méně časově náročné. Nemůžeme si představit život bez těchto zařízení, ale přesto je ...
Jak změnit velikost, barvu a schéma kurzoru myši a kurzoru v systému Windows 10
Ukazatel myši a kurzor ve Windows 10 jsou velmi důležité aspekty operačního systému. To lze říci i pro jiné operační systémy, takže ve skutečnosti nej...
Hry Zdarma a open source herní motory pro vývoj linuxových her
Zdarma a open source herní motory pro vývoj linuxových her
Tento článek pokryje seznam bezplatných a otevřených herních enginů, které lze použít pro vývoj 2D a 3D her v systému Linux. Existuje mnoho takových h...