Diagrama de configurare de bază:
Iată diagrama de configurare de bază pentru a rula acest program.
Pentru simplitate, vom numi Sistemul A ca client_A și Sistemul B ca B_server în tot articolul.
Cerințe privind fișierul:
Avem nevoie Server.py iar acest fișier ar trebui să fie prezent la sistemul server. În cazul nostru server.py ar trebui să fie la sistemul B_server.
Alte două fișiere client.py și probă.txt ar trebui să fie prezent la sistemul client. În cazul nostru, aceste două fișiere ar trebui să fie prezente la sistemul A_client.
Ipoteze:
Iată ipotezele:
- Ar trebui să avem două sisteme Linux cu acces la terminal.
- Aroma Linux preferată este Ubuntu.
- Python3 ar trebui instalat.
- Ambele sisteme Linux ar trebui să poată face ping reciproc. Utilizare ping
comanda pentru a verifica ping. - Un sistem ar trebui să acționeze ca server și alt sistem ar trebui să acționeze ca client la un moment dat.
Limitări:
Înainte de a continua, ar trebui să știm că există unele limitări ale acestui program.
- Python3 + ar trebui să fie instalat pentru a rula acest program. Puteți observa erori sau comportamente diferite dacă rulați pe versiuni mai vechi Python.
- Doar fișierul text poate fi transferat prin acest program de acum. Orice alt fișier format care nu conține text poate eșua.
- Excepțiile de programare de bază au fost tratate în program.
- Programul poate sau nu să ruleze pe alt SO decât Ubuntu.
- Fișierul text ar trebui să fie scurt la partea clientului, deoarece a fost utilizată dimensiunea bufferului de 1024 octeți.
Configurați cerințele:
- Avem nevoie de cel puțin un sistem Linux pentru a încerca acest program. Dar recomandarea este să folosiți două sisteme Linux diferite care sunt conectate prin rețea.
- Două sisteme ar trebui să fie conectate prin Ethernet sau Wi-Fi sau orice altă conexiune.
Cod sursă server:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / server.py
Cod sursă client:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / client.py
Cum se execută programe și ieșirea preconizată:
Iată pașii pentru executarea programului.
Pasul 1: Accesați sistemul B_server și deschideți un terminal. Scurtătură pentru a deschide un terminal este Alt + Ctrl + t.
Pasul 2: Acum mergeți pe calea unde server.py este prezent.
Pasul 3: Rulați acum serverul.py ca mai jos
server python3.pyNu ar trebui să existe erori și ar trebui să vedeți mai jos tipăriturile
Serverul este listat pe port: 9898Numele fișierului copiat va fi recv.txt în partea serverului
Pasul 4: Acum deschideți terminalul la sistemul A_client.
Pasul 5: Mergeți la calea în care clientul.py și eșantion.txt sunt prezente.
Pasul 6: Rulați acum clientul.py ca mai jos
client python3.pyAm observat că trebuie să cunoaștem adresa IP a serverului. Putem executa comanda de mai jos pentru a cunoaște adresa IP a sistemului B_server.
ifconfig
Acum, ieșirea sistemului A_client ar trebui să fie astfel
################## Mai jos mesajul este primit de la server ###################| --------------------------------- |
Bună client [adresa IP: 192.168.1.102],
** Bun venit pe server **
-Server
| --------------------------------- |
Pasul 7: Acum accesați B_server și căutați rezultatul de mai jos
Fișierul a fost copiat cu succesServerul a inchis conexiunea
Pasul 8: ar trebui să existe un singur nume de fișier recv.txt în folderul server. Conținutul acestei recv.txt ar trebui să fie același eșantion.txt.
Deci, am copiat cu succes un fișier de la client la server prin rețea prin intermediul programului python.
Explicații de cod:
Există două fișiere python Server.py și client.py.
Rețineți că vom explica o dată dacă vreun cod este același în interiorul serverului.py și client.py.
- Server.py:
Aceasta este linia shebang, ceea ce înseamnă în mod implicit acest server.py ar trebui să folosească python3. Să vedem un avantaj al acestei linii.
Am executat serverul.py sau client.cum ar fi python3 <.py file name>. Acum, fără a folosi python3, putem executa fișierul python. Urmați comenzile de mai jos
Accesați modul super utilizator:
suDați toată permisiunea pentru .fișier py:
server chmod 777.pyRulați serverul.py:
./Server.socket de import pyImportarea bibliotecii socket în programul Python pe măsură ce mergem
pentru a utiliza soclul pentru conectare.
s = soclu.priză()
Creăm un obiect „S” pentru a accesa toate metodele de socket. Acesta este un concept OOPs.
PORT = 9898Acum alegem un port în care serverul va asculta. Putem folosi portul non rezervat în locul acestuia.
s.legare ((", PORT))Folosim metoda bind pentru a lega adresa IP a serverului la acel port [9898]. O observație este că am fi putut folosi adresa IP exactă a serverului în locul primului argument al metodei de legare, dar am ales să lăsăm necompletat, deoarece acest lucru funcționează bine.
s.legare ((adresa IP, PORT))fișier = deschis ("recv.txt "," wb ")
Am deschis un singur nume de fișier „recv.txt ”în server pentru modul de scriere și a primit indicatorul de fișier. Acest lucru este necesar deoarece trebuie să copiem un fișier text de la client.
în timp ce este adevărat:Să începem o buclă infinită în timp ce sarcina serverului este să așteptăm până când un client comunică cu serverul pe acel port 9898. Deci, este necesară această buclă while.
conn, addr = s.Accept()Acest cod trebuie să accepte orice cerere de conexiune primită de la client. Conn va folosi „conn ” să comunice cu clientul și „Addr” este adresa IP a clientului care a trimis o cerere de agitație către acest server pe portul 9898.
msg = "\ n \ n | -------------------------------- | \ n Bună client [adresa IP:"+ addr [0] +"], \ n ** Bine ați venit la Server ** \ n -Server \ n
| --------------------------------- | \ n \ n \ n "
Acest cod este pentru a crea un mesaj pentru a-l trimite clientului. Acest mesaj ar trebui să fie tipărit pe terminalul clientului. Acest lucru confirmă faptul că clientul este capabil să comunice cu serverul.
conn.trimite (msg.codifica())Acum avem mesajul gata și apoi îl trimitem clientului folosind acesta „Conn”. Acest cod trimite de fapt mesajul către client.
RecvData = conn.recv (1024)Acest cod primește orice date trimise din partea clientului. În cazul nostru, ne așteptăm la conținutul eșantionului.txt în „RecvData”.
în timp ce RecvData:Încă o buclă while cu condiția RecvData nu este goală. În cazul nostru nu este gol.
fişier.scrie (RecvData)Odată ce avem conținut în interior „RecvData” apoi scriem în acel fișier „Recv.txt" folosind indicatorul de fișier "fişier".
RecvData = conn.recv (1024)Din nou, încercând să primim dacă există date de la client. O singura data „RecvData” nu are date, codul va sparge bucla while.
fişier.închide()Acest lucru va închide doar indicatorul fișierului, după cum am terminat cu scrierea fișierului.
conn.închide()Aceasta va închide conexiunea cu clientul.
pauzăAceasta trebuie să iasă din bucla infinită while la B_server.
- client.py:
Importând biblioteca sys așa cum dorim, folosim facilitatea de argumentare în python.
if (len (sys.argv)> 1):ServerIp = sys.argv [1]
altceva:
print ("\ n \ n Rulați ca \ n clientul python3.py < serverip address > \ n \ n ")
ieșire (1)
Pe măsură ce trecem adresa IP a B_server după numele fișierului client.py în timp ce rulăm, trebuie să prindem acea adresă IP a serverului în interiorul clientului.
... if (len (sys.argv)> 1): => Pentru a vă asigura că utilizatorul trece cel puțin un argument ca adresă IP și prinde acea adresă IP insdie „ServerIP”.
Dacă utilizatorul nu trece cel puțin un cod de argument arată ajutorul și iese din cod.
PORT = 9898Acesta trebuie să fie același port ca cel menționat la partea B_server.
s.conectare ((ServerIp, PORT))Acest cod va face conexiunea TCP la IP-ul serverului cu acel port. Orice lucru greșit la acest ponint duce la eșecuri în conexiune.
fișier = deschis ("exemplu.txt "," rb ")Deschidem „eșantionul.txt ”în modul de citire pentru a citi numai conținut.
SendData = fișier.citit (1024)Citirea conținutului fișierului și introducerea în interiorul „SendData ” variabil.
în timp ce SendData:Începem o buclă while dacă „SendData ” are date. În cazul nostru dacă „eșantion.txt ”nu este gol, ar trebui să conțină date.
s.trimite (SendData)Acum putem trimite conținut de "probă.txt" la server folosind obiectul socket „S”.
SendData = fișier.citit (1024)Din nou citind dacă a mai rămas ceva. Deci, nu va fi nimic de citit din fișier „SendData” va fi gol și va ieși din bucla while.
s.închide()Aceasta nu închide conexiunea din partea clientului.
Capturi de ecran Ubuntu partea serverului
Capturi de ecran Ubuntu Partea client
Combinații testate:
- Linux ca server și Linux ca client: PASS
- Linux ca client și Linux ca server: PASS
- Linux ca server și Windows10 ca client: PASS
- Linux ca client și Windows10 ca server: PASS
Recomandarea este să utilizați două sisteme Linux pentru server și client.
Erori așteptate:
- Puteți vedea eroarea de mai jos dacă serverul nu rulează pe portul 9898
Traceback (ultimul apel cel mai recent):
Fișier „client.py ", linia 22, îns.conectare ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Conexiunea a fost refuzată
- Mai jos apare eroarea dacă adresa IP nu este transmisă la partea clientului
Aleargă ca
client python3.py < serverip address >- Mai jos se vede eroarea dacă 1Sf argumentul din partea clientului nu este o adresă IP
Traceback (ultimul apel cel mai recent):
Fișier "client.py ", linia 22, îns.conectare ((ServerIp, PORT))
priză.gaierror: [Errno -2] Nume sau serviciu necunoscut
- Mai jos apare eroarea dacă portul este utilizat ca 98980
Traceback (ultimul apel cel mai recent):
Fișier "client.py ", linia 22, îns.conectare ((ServerIp, PORT))
OverflowError: getsockaddrarg: portul trebuie să fie 0-65535.
- Mai jos se vede eroarea dacă „sample.txt ”nu este prezent la partea clientului.
Traceback (ultimul apel cel mai recent):
Fișier "client.py ", linia 25, înfișier = deschis ("exemplu.txt "," rb ")
FileNotFoundError: [Errno 2] Nu există un astfel de fișier sau director: 'sample.txt'
Concluzie:
Folosind acest program putem trimite un fișier text simplu de la un sistem la alt sistem prin rețea folosind programul python. Acest lucru ne oferă învățarea de bază a programării python și socket, de asemenea, pentru trimiterea de date prin rețea.