Python

Python Socket File Transfer Odoslať

Python Socket File Transfer Odoslať
Zámerom tohto článku je naučiť sa ako preniesť textový súbor cez sieť cez program python -. Tento prenos súborov je založený na modeli serverového klienta, ktorý umožňuje použitie programovania soketov v python3+.

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:

Obmedzenia:

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

Nastaviť požiadavky:

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.py

Nemali by byť žiadne chyby a mali by ste vidieť výtlačky nižšie

Server je uvedený na porte: 9898

Ná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.py

Zistili 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.

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

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:

su

Udeľte všetkým povolenie .súbor py:

server chmod 777.py

Spustiť server.py:

./ server.py import soket
Import 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 = 9898

Teraz 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ávka

To má vyjsť z nekonečnej while cyklu na B_server.

  1. zákazník.py:
import sys

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 = 9898

Musí 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:

  1. Ak server nebeží na porte 9898, môžete vidieť nasledujúcu chybu

Traceback (posledný posledný hovor):

Spisový klient.py ", linka 22, v
s.pripojiť ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Pripojenie odmietnuté
  1. Nižšie uvedená chyba sa zobrazí, ak adresa IP nie je odovzdaná na strane klienta

Bežte ako

klient python3.py < serverip address >
  1. Nižšie je uvedená chyba, ak 1sv argumentom na strane klienta nie je IP adresa

Traceback (posledný posledný hovor):

Spisový klient.py ", linka 22, v
s.pripojiť ((ServerIp, PORT))
zásuvka.gaierror: [Errno -2] Názov alebo služba nie sú známe
  1. Nižšia chyba je viditeľná, ak sa port používa ako 98980

Traceback (posledný posledný hovor):

Spisový klient.py ", linka 22, v
s.pripojiť ((ServerIp, PORT))
OverflowError: getsockaddrarg: port musí byť 0-65535.
  1. Nižšie je uvedená chyba, ak „ukážka.txt ”sa nenachádza na strane klienta.

Traceback (posledný posledný hovor):

Spisový klient.py ", riadok 25, v
file = 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ť.

Hry SuperTuxKart pre Linux
SuperTuxKart pre Linux
SuperTuxKart je vynikajúci titul navrhnutý tak, aby vám priniesol zážitok z hry Mario Kart zadarmo na vašom systéme Linux. Je to dosť náročné a zábavn...
Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
Battle for Wesnoth je jednou z najpopulárnejších open source strategických hier, ktoré si v súčasnosti môžete zahrať. Táto hra bola nielen vyvinutá ve...
Hry 0 A.D. Výukový program
0 A.D. Výukový program
Z mnohých strategických hier je tu 0 A.D. dokáže vyniknúť ako komplexný titul a veľmi hlboká, taktická hra napriek tomu, že je otvoreným zdrojom. Vývo...