Piton

Python Socket Prijenos datoteka Pošalji

Python Socket Prijenos datoteka Pošalji
Namjera ovog članka je naučiti kako prenijeti tekstualnu datoteku preko mreže putem programa python. Ovaj prijenos datoteka temelji se na poslužiteljskom klijentskom modelu za korištenje socket programiranja u python3+.

Dijagram osnovnog postavljanja:

Evo osnovnog postavljenog dijagrama za pokretanje ovog programa.

Radi jednostavnosti, sustav A nazvat ćemo A_client, a B sustav B_server u cijelom članku.

Zahtjevi datoteke:

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

Još dvije datoteke klijent.py i uzorak.txt treba biti prisutan u klijentskom sustavu. U našem slučaju te dvije datoteke trebale bi biti prisutne u sustavu A_client.

Pretpostavke:

Evo pretpostavki:

Ograničenja:

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

Postavljanje zahtjeva:

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

Evo koraka za izvršavanje programa.

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

Korak2: Idite sada putem poslužitelja.py je prisutan.

Korak 3: Sada pokrenite poslužitelj.py kao dolje

python3 poslužitelj.py

Ne bi trebalo biti pogrešaka i trebali biste vidjeti dolje ispise

Poslužitelj se nalazi na portu: 9898

Kopirano ime datoteke bit će zabilježeno.txt na strani poslužitelja

Korak 4: Sada otvorite terminal na sustavu A_client.

Korak 5: Idite na stazu gdje je klijent.py i uzorak.txt su prisutni.

Korak 6: Sada pokrenite klijenta.py kao dolje

klijent python3.py

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

ifconfig

Sada bi izlaz sustava A_client trebao biti ovakav

################### Ispod je poruka primljena od poslužitelja ###################
| -------------------------------- |
Pozdrav klijentu [IP adresa: 192.168.1.102],
** Dobrodošli na poslužitelj **
-Poslužitelj
| -------------------------------- |

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

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

Korak 8: Trebalo bi imati jedno ime datoteke recv.txt u mapi poslužitelja. Sadržaj ove prim.txt bi trebao biti isti uzorak.txt.

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

Objašnjenja koda:

Postoje dvije datoteke python poslužitelju.py i klijent.py.

Imajte na umu da ćemo jednom objasniti je li bilo koji kôd isti unutar poslužitelja.py i klijent.py.

  1. poslužitelju.py:
#!/ usr / bin / env python3

Ovo je shebang linija što podrazumevano znači ovaj poslužitelj.py bi trebao koristiti python3. Pogledajmo jednu prednost ove linije.

Izvršili smo poslužitelj.py ili klijent.py poput python3 <.py file name>. Sada bez upotrebe python3 možemo izvršiti python datoteku. Slijedite naredbe u nastavku

Idite na način super korisnika:

su

Dajte svo dopuštenje za .py datoteka:

chmod 777 poslužitelj.py

Pokrenite poslužitelj.py:

./ poslužitelj.py utičnica za uvoz
Uvozimo knjižnicu soketa u program python kako idemo
za upotrebu utičnice za povezivanje.
s = utičnica.utičnica ()

Stvaramo objekt "S" za pristup svim metodama soketa. Ovo je koncept OOP-a.

LUKA = 9898

Sada odabiremo jedan port na kojem će poslužitelj slušati. Umjesto ovoga možemo koristiti nerezervirani port.

s.bind ((", PORT))

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

s.vezati ((IP adresa, PORT))
datoteka = otvorena ("recv.txt "," wb ")

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

dok je Istina:

Pokrenimo jednu beskonačnu while petlju jer je posao poslužitelja pričekati dok klijent ne komunicira sa poslužiteljem na tom 9898 portu. Dakle, potrebna je ova petlja.

conn, addr = s.prihvatiti()

Ovaj kôd prihvaća svaki dolazni zahtjev za povezivanje od klijenta. Conn će upotrijebiti "spojiti " komunicirati s klijentom i "Adresa" je IP adresa klijenta koji je poslao zahtjev za komešanje na ovaj poslužitelj na portu 9898.

msg = "\ n \ n | --------------------------------- | \ n Pozdrav klijentu [IP adresa:
"+ addr [0] +"], \ n ** Dobrodoš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. To potvrđuje da je klijent u mogućnosti komunicirati s poslužiteljem.

spoj.poslati (msg.encode ())

Sada imamo poruku spremnu, a zatim je pošaljite klijentu pomoću nje "Spojiti". Ovaj kod zapravo šalje poruku klijentu.

RecvData = povez.rekv (1024)

Ovaj kod prima sve podatke koji se šalju s klijentske strane. U našem slučaju očekujemo sadržaj uzorka.txt u "RecvData".

dok RecvData:

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

datoteka.pisanje (RecvData)

Jednom kad imamo sadržaj unutra "RecvData" onda pišemo u tu datoteku “Preporuč.txt " pomoću pokazivača datoteke "datoteka".

RecvData = povez.rekv (1024)

Ponovno pokušavam primiti postoje li podaci od klijenta. Jednom "RecvData" nema podataka kôd će prekinuti while petlju.

datoteka.Zatvoriti()

Ovo će samo zatvoriti pokazivač datoteke kao što smo završili s upisivanjem datoteke.

spoj.Zatvoriti()

Ovo će zatvoriti vezu s klijentom.

pauza

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

  1. klijent.py:
import sys

Uvoz sys biblioteke kako želimo koristi objekt argumenta u pythonu.

if (len (sys.argv)> 1):
ServerIp = sys.argv [1]
drugo:
print ("\ n \ n Pokreni se poput \ n python3 klijenta.py < serverip address > \ n \ n ")
izlaz (1)

Dok prolazimo IP adresu B_servera nakon klijenta imena datoteke.py tijekom izvođenja, moramo uhvatiti tu IP adresu poslužitelja unutar klijenta.

… If (len (sys.argv)> 1): => Kako bi osigurao da korisnik prenese barem jedan argument kao IP adresu i uhvati tu IP adresu na mjestu “ServerIP”.

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

LUKA = 9898

Ovo mora biti isti port kao što je spomenuto na strani B_server.

s.povezivanje ((ServerIp, PORT))

Ovaj će kôd uspostaviti TCP vezu na IP poslužitelja s tim portom. Sve pogrešno u ovom pontinu rezultira neuspjesima u vezi.

datoteka = otvorena ("uzorak.txt "," rb ")

Otvaramo „uzorak.txt ”u načinu čitanja za čitanje samo sadržaja.

SendData = datoteka.pročitajte (1024)

Čitanje sadržaja datoteke i stavljanje unutra “SendData ” varijabilna.

dok SendData:

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

s.poslati (SendData)

Sada možemo poslati sadržaj "uzorak.txt " na poslužitelj pomoću socket objekta "S".

SendData = datoteka.pročitajte (1024)

Opet čitanje ako je nešto ostalo. Dakle, iz datoteke se neće imati što čitati “SendData” bit će prazan i izaći će iz while petlje.

s.Zatvoriti()

Ovo nije bliska veza s klijentske strane.

Ubuntu snimke zaslona Stranica 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 klijent.

Očekivane pogreške:

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

Traceback (najnoviji zadnji poziv):

Datoteka "klijent.py ", redak 22, u
s.povezivanje ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Veza je odbijena
  1. Ispod se vidi pogreška ako IP adresa nije proslijeđena na strani klijenta

Trči kao

klijent python3.py < serverip address >
  1. Ispod se vidi pogreška ako je 1sv argument na strani klijenta nije IP adresa

Traceback (najnoviji zadnji poziv):

Datoteka "klijent.py ", redak 22, u
s.povezivanje ((ServerIp, PORT))
utičnica.gaierror: [Errno -2] Ime ili usluga nisu poznati
  1. Ispod se vidi pogreška ako se port koristi poput 98980

Traceback (najnoviji zadnji poziv):

Datoteka "klijent.py ", redak 22, u
s.povezivanje ((ServerIp, PORT))
OverflowError: getsockaddrarg: port mora biti 0-65535.
  1. Ispod se vidi pogreška ako je „uzorak.txt ”nije prisutan na strani klijenta.

Traceback (najnoviji zadnji poziv):

Datoteka "klijent.py ", redak 25, u
datoteka = otvorena ("uzorak.txt "," rb ")
FileNotFoundError: [Errno 2] Nema takve datoteke ili direktorija: 'sample.txt '

Zaključak:

Korištenjem ovog programa možemo poslati jednostavnu tekstualnu datoteku iz jednog sustava u drugi sustav putem mreže pomoću programa python. To nam daje osnovno učenje programiranja na pythonu i socketu, kao i za slanje podataka putem mreže.

Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...
0 A.D. Vodič
Od mnogih strateških igara tamo, 0 A.D. uspijeva se istaknuti kao sveobuhvatan naslov i vrlo duboka, taktička igra unatoč tome što je otvoren izvor. R...
Vodič za Unity3D
Uvod u Unity 3D Unity 3D moćan je motor za razvoj igara. Cross platforma je to što vam omogućuje stvaranje igara za mobilne uređaje, web, stolne račun...