Piton

Trimitere fișier Python Socket

Trimitere fișier Python Socket
Intenția acestui articol este de a învăța cum să transferați un fișier text prin rețea prin programul Python. Acest transfer de fișiere se bazează pe modelul clientului server pentru a utiliza programarea socketului în python3+.

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:

Limitări:

Înainte de a continua, ar trebui să știm că există unele limitări ale acestui program.

Configurați cerințele:

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

Nu ar trebui să existe erori și ar trebui să vedeți mai jos tipăriturile

Serverul este listat pe port: 9898

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

Am 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 succes
Serverul 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.

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

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:

su

Dați toată permisiunea pentru .fișier py:

server chmod 777.py

Rulați serverul.py:

./Server.socket de import py
Importarea 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 = 9898

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

  1. client.py:
import sisteme

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

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

  1. 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, în
s.conectare ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Conexiunea a fost refuzată
  1. Mai jos apare eroarea dacă adresa IP nu este transmisă la partea clientului

Aleargă ca

client python3.py < serverip address >
  1. 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, în
s.conectare ((ServerIp, PORT))
priză.gaierror: [Errno -2] Nume sau serviciu necunoscut
  1. Mai jos apare eroarea dacă portul este utilizat ca 98980

Traceback (ultimul apel cel mai recent):

Fișier "client.py ", linia 22, în
s.conectare ((ServerIp, PORT))
OverflowError: getsockaddrarg: portul trebuie să fie 0-65535.
  1. 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, în
fiș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.

WinMouse lets you customize & improve mouse pointer movement on Windows PC
If you want to improve the default functions of your mouse pointer use freeware WinMouse. It adds more features to help you get the most out of your h...
Mouse left-click button not working on Windows 10
If you are using a dedicated mouse with your laptop, or desktop computer but the mouse left-click button is not working on Windows 10/8/7 for some rea...
Cursor jumps or moves randomly while typing in Windows 10
If you find that your mouse cursor jumps or moves on its own, automatically, randomly while typing in Windows laptop or computer, then some of these s...