Trimitere transfer fișiere socket Python

Python Socket File Transfer Send



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 client server pentru a utiliza programarea socket în python3 +.

Iată diagrama de configurare de bază pentru a rula acest program.









Pentru simplitate, vom numi Sistemul A ca client A_ și Sistemul B ca server B_ pe tot parcursul articolului.



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 sample.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 + trebuie 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 de a utiliza 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 în care este prezent server.py.

Pasul 3: Rulați acum server.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: Deschideți acum terminalul la sistemul A_client.

Pasul 5: Accesați calea unde sunt prezente client.py și sample.txt.

Pasul 6: Rulați acum client.py ca mai jos

client python3.py <B_server IP sistem>

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 așa

################## 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 dosarul serverului. Conținutul acestui recv.txt ar trebui să fie același sample.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 server.py și client.py.

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

Aceasta este linia shebang, ceea ce înseamnă că în mod implicit acest server.py ar trebui să utilizeze python3. Să vedem un avantaj al acestei linii.

Am executat server.py sau client.py ca. python3. Acum, fără a folosi python3 putem executa fișierul python. Urmați comenzile de mai jos

Accesați modul super utilizator:

este

Acordați toate permisiunile pentru fișierul .py:

chmod777Server.py

Rulați server.py:

./Server.py import priză
Importândprizăbibliotecă în programul Pythonla fel demergem
a folosipriză pentruconexiune.

s = priză.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 un port care nu este rezervat în locul acestuia.

s.lega(('',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.lega((adresa IP,PORT))
fişier = deschis(„recv.txt”, „wb”)

Am deschis un nume de fișier recv.txt în server pentru modul de scriere și am primit indicatorul de fișier. Acest lucru este necesar deoarece trebuie să copiem un fișier text de la client.

in timp ce 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| --------------------------------- | nBună client [adresa IP:
'
+ addr[0]+'], n** Bun venit pe 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 poate comunica 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 sample.txt în RecvData .

in timp ceRecvData:

Î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ă primesc dacă există date de la client. O singura data RecvData nu are date, codul va sparge bucla while.

fişier.închide()

Aceasta va închide doar pointerul fișierului, după cum am terminat cu scrierea fișierului.

conn.închide()

Aceasta va închide conexiunea cu clientul.

pauză

Aceasta va ieși din bucla infinită while la B_server.

  1. client.py:
import sys

Importarea bibliotecii sys așa cum dorim, folosește facilitatea de argumentare în python.

dacă (len(sys.argv) > 1):
ServerIp= sys.argv[1]
altceva:
imprimare(' n nAleargă ca. npython3 client.py 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 argument arată ajutor și iese din cod.

PORT= 9898

Acesta trebuie să fie același port ca cel menționat în partea B_server.

s.conectați((ServerIp,PORT))

Acest cod va face conexiunea TCP la IP-ul serverului cu acel port. Orice lucru greșit la acest punct duce la eșecuri în conexiune.

fişier = deschis(„sample.txt”, „rb”)

Deschidem sample.txt în modul de citire pentru a citi numai conținut.

SendData= fişier.citit(1024)

Citirea conținutului fișierului și introducerea în interior SendData variabil.

in timp ceSendData:

Începem o buclă while dacă SendData are date. În cazul nostru, dacă sample.txt nu este gol, ar trebui să aibă date.

s.trimite(SendData)

Acum putem trimite conținut de sample.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 de a utiliza 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”,linia22, în <modul>
s.conectați((ServerIp,PORT))
ConnectionRefusedError:[Errno111]Conexiune refuzată
  1. Mai jos apare o eroare dacă adresa IP nu este transmisă în partea clientului

Aleargă ca.

client python3.py <adresa IP a serverului>
  1. Mai jos se vede eroarea dacă 1Sfargumentul din partea clientului nu este o adresă IP

Traceback (ultimul apel cel mai recent):

Fişier„client.py”,linia22, în <modul>
s.conectați((ServerIp,PORT))
priză.gaierror:[Errno -2]Numesauserviciunucunoscut
  1. Mai jos apare o eroare dacă portul este utilizat ca 98980

Traceback (ultimul apel cel mai recent):

Fişier„client.py”,linia22, în <modul>
s.conectați((ServerIp,PORT))
OverflowError: getsockaddrarg: portul trebuie să fie0-65535.
  1. Mai jos apare eroarea dacă sample.txt nu este prezent la partea clientului.

Traceback (ultimul apel cel mai recent):

Fişier„client.py”,linia25, în <modul>
fişier = deschis(„sample.txt”, „rb”)
FileNotFoundError:[Errno2]Nici o astfel defişier saudirector:„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.