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:
- Měli bychom mít dva systémy Linux s terminálovým přístupem.
- Výhodná příchuť Linuxu je Ubuntu.
- Python3 by měl být nainstalován.
- Oba systémy Linux by měly být schopné navzájem si vyzkoušet ping. 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, 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 běžíte na starších verzích pythonu, můžete pozorovat chybu nebo odlišné chování.
- Pomocí tohoto programu lze nyní přenášet pouze textové soubory. Může dojít k selhání jiného formátu, který neobsahuje text.
- V programu byly zpracovány základní programové výjimky.
- Program může nebo nemusí fungovat 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 připojeny prostřednictvím sítě.
- Dva systémy by měly být připojeny prostřednictvím sítě Ethernet nebo Wi-Fi nebo jakéhokoli jiného připojení.
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.pyNemělo by docházet k žádným chybám a měli byste vidět níže uvedené výtisky
Server vypisuje na port: 9898Ná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.pyZjistili 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ánServer 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.
- serveru.py:
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:
suDát veškerá povolení .py soubor:
server chmod 777.pySpustit server.py:
./ server.py importovací zásuvkaImport 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 = 9898Nyní 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ávkaTo má vyjít z nekonečné while smyčky na B_server.
- klient.py:
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 = 9898Musí 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:
- Pokud server neběží na portu 9898, můžete vidět níže uvedenou chybu
Traceback (poslední hovor poslední):
Soubor "klient.py ", řádek 22, vs.připojit ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Připojení odmítnuto
- Níže uvedená chyba se zobrazí, pokud adresa IP není předána na straně klienta
Běž jako
klient python3.py < serverip address >- Níže uvedená chyba se zobrazí, pokud 1Svatý argument na straně klienta není IP adresa
Traceback (poslední hovor poslední):
Soubor "klient.py ", řádek 22, vs.připojit ((ServerIp, PORT))
zásuvka.gaierror: [Errno -2] Název nebo služba není známa
- Níže uvedená chyba je vidět, pokud je port používán jako 98980
Traceback (poslední hovor poslední):
Soubor "klient.py ", řádek 22, vs.připojit ((ServerIp, PORT))
OverflowError: getsockaddrarg: port musí být 0-65535.
- Níže uvedená chyba se zobrazí, pokud „ukázka.txt ”není na straně klienta.
Traceback (poslední hovor poslední):
Soubor "klient.py ", řádek 25, vfile = 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.