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:
- Trebali bismo imati dva Linux sustava s pristupom terminalu.
- Poželjni Linux okus je Ubuntu.
- Treba instalirati Python3.
- Oba Linux sustava trebala bi međusobno pingati. Koristiti ping
naredba za provjeru pinga. - Jedan sustav trebao bi se ponašati kao poslužitelj, a drugi sustav kao klijent u određeno vrijeme.
Ograničenja:
Prije nego što nastavimo dalje, trebali bismo znati da postoje neka ograničenja ovog programa.
- Za pokretanje ovog programa treba instalirati Python3 +. Možete primijetiti pogrešku ili drugačije ponašanje ako se izvode na starijim verzijama pythona.
- Kroz ovaj program od sada se može prenijeti samo tekstualna datoteka. Bilo koja druga datoteka formata koja ne sadrži tekst može propasti.
- U programu su obrađene osnovne programske iznimke.
- Program se može ili ne mora izvoditi na OS-u osim Ubuntu-a.
- Tekstualna datoteka trebala bi biti kratka na strani klijenta jer je korištena veličina međuspremnika od 1024 bajta.
Postavljanje zahtjeva:
- Za isprobavanje ovog programa potreban nam je barem jedan Linux sustav. Ali preporuka je koristiti dva različita Linux sustava koja su povezana mrežom.
- Dva sustava trebala bi 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 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.pyNe bi trebalo biti pogrešaka i trebali biste vidjeti dolje ispise
Poslužitelj se nalazi na portu: 9898Kopirano 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.pyPrimijetili 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 kopiranaPosluž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.
- poslužitelju.py:
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:
suDajte svo dopuštenje za .py datoteka:
chmod 777 poslužitelj.pyPokrenite poslužitelj.py:
./ poslužitelj.py utičnica za uvozUvozimo 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 = 9898Sada 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.
pauzaOvo će izaći iz beskonačne while petlje na B_server.
- klijent.py:
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 = 9898Ovo 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:
- Ispod možete vidjeti pogrešku ako poslužitelj ne radi na portu 9898
Traceback (najnoviji zadnji poziv):
Datoteka "klijent.py ", redak 22, us.povezivanje ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Veza je odbijena
- Ispod se vidi pogreška ako IP adresa nije proslijeđena na strani klijenta
Trči kao
klijent python3.py < serverip address >- Ispod se vidi pogreška ako je 1sv argument na strani klijenta nije IP adresa
Traceback (najnoviji zadnji poziv):
Datoteka "klijent.py ", redak 22, us.povezivanje ((ServerIp, PORT))
utičnica.gaierror: [Errno -2] Ime ili usluga nisu poznati
- Ispod se vidi pogreška ako se port koristi poput 98980
Traceback (najnoviji zadnji poziv):
Datoteka "klijent.py ", redak 22, us.povezivanje ((ServerIp, PORT))
OverflowError: getsockaddrarg: port mora biti 0-65535.
- Ispod se vidi pogreška ako je „uzorak.txt ”nije prisutan na strani klijenta.
Traceback (najnoviji zadnji poziv):
Datoteka "klijent.py ", redak 25, udatoteka = 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.