Slanje prijenosa datoteka Python Socket datoteke

Python Socket File Transfer Send

Namjera ovog članka je naučiti kako prenijeti tekstualnu datoteku preko mreže putem programa python . Ovaj prijenos datoteka temelji se na modelu klijentskog poslužitelja za korištenje programiranja utičnica u python3+.

Ovdje je osnovni dijagram postavljanja za pokretanje ovog programa.





Radi jednostavnosti u cijelom ćemo članku nazvati sustav A kao A_client i sustav B kao B_server.



Zahtjevi za datoteku:

Trebamo server.py i ova datoteka bi trebala biti prisutna u poslužiteljskom sustavu. U našem slučaju server.py bi trebao biti u B_server sustavu.

Još dvije datoteke client.py i sample.txt trebaju biti prisutni u klijentskom sustavu. U našem slučaju te dvije datoteke trebale bi biti prisutne u sustavu A_client.

Pretpostavke:

Evo pretpostavki:



  • Trebali bismo imati dva Linux sustava s pristupom terminalu.
  • Poželjni okus Linuxa je Ubuntu .
  • Treba instalirati Python3.
  • Oba Linux sustava trebala bi se međusobno pingati. Koristiti ping naredba za provjeru pinga.
  • Jedan sustav trebao bi djelovati kao poslužitelj, a drugi sustav kao klijent u jednom određenom trenutku.

Ograničenja:

Prije nego nastavimo, trebali bismo znati da postoje neka ograničenja ovog programa.

  • Za pokretanje ovog programa trebao bi biti instaliran Python3+. Možete primijetiti pogrešku ili drugačije ponašanje ako se izvode na starijim verzijama pythona.
  • Kroz ovaj program se od sada može prenijeti samo tekstualna datoteka. Bilo koja druga datoteka formata koja ne sadrži tekst može uspjeti.
  • Osnovne programske iznimke obrađene su u programu.
  • Program može, ali i ne mora raditi na drugom OS -u osim Ubuntu -a.
  • Tekstualna datoteka treba biti kratka na strani klijenta jer je korištena veličina međuspremnika od 1024 bajta.

Postavite zahtjeve:

  • Za isprobavanje ovog programa potreban nam je barem jedan Linux sustav. Ali preporuka je koristiti dva različita Linux sustava koji su povezani putem mreže.
  • Dva sustava trebaju biti povezana putem Etherneta ili Wi-Fi-ja ili bilo koje druge veze.

Izvorni kod poslužitelja:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

Izvorni kod klijenta:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

Kako pokrenuti programe i očekivani ispis:

Evo koraka za izvršavanje programa.

1. korak: Idite na sustav B_server i otvorite terminal. Prečac za otvaranje terminala je Alt+Ctrl+t.

Korak 2: Sada idite putem na kojem je server.py prisutan.

Korak 3: Sada pokrenite server.py kao ispod

poslužitelj python3.py

Ne bi trebalo biti grešaka, a ispod bi trebali vidjeti otiske

Poslužitelj se nalazi na portu: 9898

Kopirani naziv datoteke bit će recv.txt na strani poslužitelja

Korak 4: Sada otvorite terminal u sustavu A_client.

Korak 5: Idite na putanju na kojoj su prisutni client.py i sample.txt.

Korak 6: Sada pokrenite client.py kao dolje

klijent python3.py <B_služiteljski IP sustav>

Uočili smo da moramo znati IP adresu poslužitelja. Možemo izvršiti naredbu ispod kako bismo znali IP adresu B_server sustava.

ifconfig

Sada bi izlaz A_client sustava trebao biti ovakav

################### Poruka ispod je primljena od poslužitelja ##################
| --------------------------------- |
Zdravo klijent[IP adresa: 192.168.1.102],
** Dobro došli na poslužitelj **
-Server
| --------------------------------- |

Korak 7: Sada idite na B_server i potražite donji izlaz

Datoteka je uspješno kopirana
Poslužitelj je prekinuo vezu

Korak 8: U mapi poslužitelja trebao bi biti jedan naziv datoteke recv.txt. Sadržaj ove datoteke recv.txt trebao bi biti isti sample.txt.

Tako smo uspješno kopirali datoteku s klijenta na poslužitelj preko mreže putem programa python.

Objašnjenja koda:

Postoje dvije python datoteke server.py i client.py .

Imajte na umu da ćemo jednom objasniti je li kôd isti unutar server.py i client.py.

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

Ovo je shebang linija što znači da bi prema zadanim postavkama ovaj server.py trebao koristiti python3. Pogledajmo jednu prednost ove linije.

Izveli smo server.py ili client.py poput python3. Sada bez korištenja python3 možemo izvršiti python datoteku. Slijedite naredbe u nastavku

Idite na način rada super korisnika:

svoje

Dajte sva dopuštenja za .py datoteku:

chmod777poslužitelja.py

Pokrenite server.py:

./poslužitelj.py uvoz utičnica
Uvozutičnicabiblioteke u program pythonkaomi idemo
koristitiutičnica zaveza.

s = utičnica.utičnica()

Stvaramo objekt s za pristup svim metodama utičnice. Ovo je OOPs koncept.

LUKA= 9898

Sada odabiremo jedan port gdje će poslužitelj slušati. Umjesto ovoga možemo koristiti port koji nije rezerviran.

s.vezati(('',LUKA))

Koristimo metodu vezanja za vezanje IP adrese poslužitelja za taj port [9898]. Jedno je zapažanje da smo mogli koristiti točnu IP adresu poslužitelja umjesto prvog argumenta metode vezanja, ali odlučili smo ostaviti prazno jer ovo dobro funkcionira.

s.vezati((IP adresa,LUKA))
datoteka = otvorena('recv.txt', 'wb')

Otvorili smo jedan naziv datoteke recv.txt na poslužitelju za način pisanja i dobili pokazivač na datoteku. To je potrebno jer moramo kopirati jednu tekstualnu datoteku s klijenta.

dok Pravi:

Počnimo s jednom beskonačnom while petljom jer je posao poslužitelja čekati dok klijent ne komunicira sa poslužiteljem na tom 9898 portu. Dakle, ova while petlja je potrebna.

conn,adr=s.prihvatiti()

Ovaj kôd prihvaća svaki dolazni zahtjev klijenta za povezivanje. Conn će koristiti conn komunicirati s klijentom i adr je IP adresa klijenta koji je poslao zahtjev za uzbunu ovom poslužitelju na portu 9898.

poruka= ' n n| --------------------------------- | nPozdrav klijent [IP adresa:
'
+ adr[0]+'], n** Dobro došli na poslužitelj ** n-Server n
| --------------------------------- | n n n'

Ovaj kôd služi za stvaranje poruke za slanje klijentu. Ovu poruku treba ispisati na klijentskom terminalu. Ovo potvrđuje da klijent može komunicirati sa poslužiteljem.

conn.poslati(porukakodirati())

Sada imamo poruku spremnu, a zatim je pomoću nje šaljemo klijentu conn. Ovaj kod zapravo šalje poruku klijentu.

RecvData=conn.recv(1024)

Ovaj kôd prima sve podatke koji se šalju sa strane klijenta. U našem slučaju očekujemo sadržaj sample.txt u RecvData .

dokRecvData:

Još jedna while petlja s uvjetom RecvData nije prazna. U našem slučaju nije prazna.

datoteka.pisati(RecvData)

Nakon što unutra imamo sadržaj RecvData onda pišemo u tu datoteku recv.txt pomoću pokazivača datoteke datoteka.

RecvData=conn.recv(1024)

Opet pokušavam primiti ako ima podataka od klijenta. Jednom RecvData nema podataka kôd će prekinuti while petlju.

datoteka.Zatvoriti()

Ovo će samo zatvoriti pokazivač datoteke dok smo završili s pisanjem datoteke.

conn.Zatvoriti()

Time ćete prekinuti vezu s klijentom.

pauza

Ovo će izaći iz beskonačne while petlje na B_serveru.

  1. client.py:
uvoz sys

Uvoz sys knjižnice kako želimo koristiti argument argument u pythonu.

ako (len(sys.argv) > 1):
ServerIp= sys.argv[1]
drugo:
ispisati(' n nTrči kao npython3 client.py n n')
Izlaz(1)

Dok prosljeđujemo IP adresu B_servera nakon naziva datoteke client.py tijekom izvođenja, moramo uloviti tu IP adresu poslužitelja unutar klijenta.

… ..If (len (sys.argv)> 1): => Da bi se osiguralo da korisnik proslijedi barem jedan argument kao IP adresu i uhvati tu IP adresu IP poslužitelja.

Ako korisnik ne proslijedi barem jedan kod argumenta, pokazuje pomoć i izlazi iz koda.

LUKA= 9898

To mora biti isti port kao što je spomenuto na strani B_servera.

s.Spojiti((ServerIp,LUKA))

Ovaj kôd će uspostaviti TCP vezu s IP poslužiteljem s tim portom. Sve što je pogrešno u ovoj točki dovodi do grešaka u vezi.

datoteka = otvorena('sample.txt', 'rb')

Otvaramo sample.txt u načinu čitanja za čitanje samo sadržaja.

SendData= datoteka.čitati(1024)

Čitanje sadržaja datoteke i stavljanje unutra SendData promjenjivo.

dokPošalji podatke:

Pokrećemo jednu while petlju if SendData ima podatke. U našem slučaju, ako sample.txt nije prazan, trebao bi imati podatke.

s.poslati(SendData)

Sada možemo poslati sadržaj od sample.txt na poslužitelj pomoću objekta utičnice s.

SendData= datoteka.čitati(1024)

Opet čitam ako je još nešto ostalo. Dakle, neće se imati što pročitati iz datoteke SendData bit će prazna i izaći će iz while petlje.

s.Zatvoriti()

Ovo ne prekida vezu sa klijentske strane.

Ubuntu snimke zaslona Na strani poslužitelja

Ubuntu snimke zaslona Klijentska strana

Testirane kombinacije:

  • Linux kao poslužitelj i Linux kao klijent: PASS
  • Linux kao klijent i Linux kao poslužitelj: PASS
  • Linux kao poslužitelj i Windows10 kao klijent: PASS
  • Linux kao klijent i Windows10 kao poslužitelj: PASS

Preporuka je koristiti dva Linux sustava za poslužitelj i klijenta.

Očekivane greške:

  1. U nastavku možete vidjeti pogrešku ako poslužitelj ne radi na portu 9898

Traceback (zadnji posljednji poziv):

Datoteka'client.py',crta22, u <modul>
s.Spojiti((ServerIp,LUKA))
ConnectionRefusedError:[Errno111]Veza je odbijena
  1. Dolje se prikazuje pogreška ako IP adresa nije proslijeđena na strani klijenta

Trči kao

klijent python3.py <serverip adresa>
  1. Dolje se prikazuje pogreška ako je 1svargument na strani klijenta nije IP adresa

Traceback (zadnji posljednji poziv):

Datoteka'client.py',crta22, u <modul>
s.Spojiti((ServerIp,LUKA))
utičnica.gaierror:[Errno -2]Imeiliservisneznan
  1. Dolje se prikazuje pogreška ako se port koristi kao 98980

Traceback (zadnji posljednji poziv):

Datoteka'client.py',crta22, u <modul>
s.Spojiti((ServerIp,LUKA))
OverflowError: getsockaddrarg: port mora biti0-65535.
  1. Dolje se prikazuje pogreška ako sample.txt nije prisutan na strani klijenta.

Traceback (zadnji posljednji poziv):

Datoteka'client.py',crta25, u <modul>
datoteka = otvorena('sample.txt', 'rb')
FileNotFoundError:[Errno2]Nema takvedatoteka iliimenik:'sample.txt'

Zaključak:

Pomoću ovog programa možemo poslati jednostavnu tekstualnu datoteku s jednog sustava na drugi sustav putem mreže pomoću programa python. To nam daje osnovno učenje programiranja pythona i utičnica također za slanje podataka putem mreže.