Python

Python Socket File Transfer Send

Python Socket File Transfer Send
Formålet med denne artikel er at lære hvordan man overfører en tekstfil over netværk via python-program. Denne filoverførsel er baseret på serverklientmodel for at bruge sokkelprogrammering i python3+.

Grundlæggende opsætningsdiagram:

Her er det grundlæggende opsætningsdiagram til at køre dette program.

For enkelheds skyld kalder vi System A som A_client og System B som B_server i hele artiklen.

Filkrav:

Vi behøver server.py og denne fil skal være til stede på serversystemet. I vores tilfælde server.py skal være på B_server-systemet.

Yderligere to filer klient.py og prøve.txt skal være til stede i klientsystemet. I vores tilfælde skal disse to filer være til stede på A_client-systemet.

Antagelser:

Her er antagelserne:

Begrænsninger:

Før vi går videre, skal vi vide, at der er nogle begrænsninger i dette program.

Opsætningskrav:

Serverkildekode:

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

Kildekildekode:

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

Sådan køres programmer og forventet output:

Her er trinene til at udføre programmet.

Trin 1: Gå til B_server-systemet, og åbn en terminal. Genvej til at åbne en terminal er Alt + Ctrl + t.

Trin 2: Gå nu stien, hvor serveren er.py er til stede.

Trin 3: Kør nu serveren.py som nedenfor

python3-server.py

Der bør ikke være nogen fejl, og du skal se nedenstående udskrifter

Serveren er noteret på port: 9898

Kopierede filnavne recv.txt på serversiden

Trin4: Åbn nu terminalen ved A_client-systemet.

Trin 5: Gå til stien, hvor klienten.py og prøve.txt er til stede.

Trin 6: Kør nu klient.py som nedenfor

python3-klient.py

Vi har observeret, at vi har brug for at kende IP-adressen på serveren. Vi kan udføre kommandoen nedenfor for at kende IP-adressen til B_server-systemet.

ifconfig

Nu skal output af A_client-systemet være sådan

#################### Nedenstående meddelelse modtages fra serveren #####################
| ---------------------------------
Hej klient [IP-adresse: 192.168.1.102],
** Velkommen til server **
-Server
| ---------------------------------

Trin7: Gå nu til B_server og se efter nedenstående output

Filen er kopieret
Server lukkede forbindelsen

Trin 8: Der skal være et filnavn recv.txt ved servermappe. Indholdet af denne recv.txt skal være den samme prøve.txt.

Så vi har med succes kopieret en fil fra klient til server over netværk via python-program.

Kode forklaringer:

Der er to python-filer server.py og klient.py.

Bemærk, at vi forklarer en gang, om en kode er den samme inden i serveren.py og klient.py.

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

Dette er shebang-linje, hvilket som standard betyder denne server.py skal bruge python3. Lad os se en fordel ved denne linje.

Vi har udført serveren.py eller klient.py ligesom python3 <.py file name>. Nu uden at bruge python3 kan vi udføre python-filen. Følg nedenstående kommandoer

Gå til superbruger-tilstand:

su

Giv al tilladelse til .py-fil:

chmod 777 server.py

Kør server.py:

./ server.py importstik
Importerer stikkontaktbibliotek til python-programmet, mens vi går
at bruge stikkontakt til tilslutning.
s = stikkontakt.stikkontakt ()

Vi skaber et objekt “S” for at få adgang til alle metoder til stikkontakt. Dette er et OOP-koncept.

PORT = 9898

Nu vælger vi en port, hvor serveren skal lytte. Vi kan bruge ikke-reserveret port i stedet for dette.

s.bind ((", PORT))

Vi bruger bindemetode til at binde server-ip-adresse til den port [9898]. En observation er, at vi kunne have brugt nøjagtig IP-adresse på serveren i stedet for det første argument for bindemetoden, men vi vælger at lade være tomme, da dette fungerer fint.

s.bind ((IP-adresse, PORT))
fil = åben ("recv.txt "," wb ")

Vi har åbnet et filnavn “recv.txt ”i server til skrivetilstand og fik filmarkør. Dette er nødvendigt, da vi skal kopiere en tekstfil fra klienten.

mens det er sandt:

Lad os starte en uendelig mens loop, da serverens job er at vente, indtil en klient kommunikerer med serveren på den 9898-port. Så dette mens loop er påkrævet.

conn, addr = s.acceptere()

Denne kode skal acceptere enhver indgående forbindelsesanmodning fra klienten. Conn bruger “forbinde ” at kommunikere med klienten og “Addr” er IP-adressen på en klient, der har sendt anmodning om oprør til denne server på port 9898.

msg = "\ n \ n | --------------------------------- | \ n Hej klient [IP-adresse:
"+ addr [0] +"], \ n ** Velkommen til Server ** \ n -Server \ n
| --------------------------------- | \ n \ n \ n "

Denne kode er til at oprette en besked, der skal sendes til klienten. Denne meddelelse skal udskrives på klientterminalen. Dette bekræfter, at klienten er i stand til at kommunikere med serveren.

tilslutning.send (msg.kode ()

Nu har vi beskeden klar, og send den derefter til klienten ved hjælp af den "Conn". Denne kode sender faktisk besked til klienten.

RecvData = tilslutning.recv (1024)

Denne kode modtager alle data, der sendes fra klientsiden. I vores tilfælde forventer vi indholdet af prøven.tekst i “RecvData”.

mens RecvData:

Én mere loop med betingelse RecvData er ikke tom. I vores tilfælde er det ikke tomt.

fil.skriv (RecvData)

Når vi har indhold inde “RecvData” så skriver vi til den fil “Recv.txt ” ved hjælp af filmarkøren "fil".

RecvData = tilslutning.recv (1024)

Igen forsøger at modtage, hvis der er data fra klienten. Enkelt gang “RecvData” har ingen data, koden vil bryde while-sløjfen.

fil.tæt()

Dette lukker bare filmarkøren, når vi er færdige med filskrivning.

tilslutning.tæt()

Dette lukker forbindelsen med klienten.

pause

Dette er at komme ud fra uendelig mens loop på B_server.

  1. klient.py:
importer sys

Import af sys-bibliotek, som vi vil bruge argumentfacilitet i python.

hvis (len (sys.argv)> 1):
ServerIp = sys.argv [1]
andet:
print ("\ n \ n Kør som \ n python3-klient.py < serverip address > \ n \ n ")
udgang (1)

Når vi videregiver IP-adressen til B_server efter filnavnet klient.py mens du kører, er vi nødt til at fange serverens IP-adresse inde i klienten.

... hvis (len (sys.argv)> 1): => For at sikre, at brugeren videregiver mindst et argument som IP-adresse og fanger den IP-adresse insdie “ServerIP”.

Hvis brugeren ikke videregiver mindst en argumentkode, viser hjælp og kommer ud af koden.

PORT = 9898

Dette skal være den samme port som nævnt på B_server-siden.

s.Opret forbindelse ((ServerIp, PORT))

Denne kode udfører TCP-forbindelse til server-IP med den port. Alt galt på denne ponint resulterer i fejl i forbindelse.

file = open ("prøve.txt "," rb ")

Vi åbner ”prøve.txt ”i læsetilstand for kun at læse indhold.

SendData = fil.læse (1024)

Læse indholdet af filen og sætte ind “SendData ” variabel.

mens SendData:

Vi starter en mens loop, hvis “SendData ” har data. I vores tilfælde hvis “prøve.txt ”er ikke tom, den skal have data.

s.send (SendData)

Nu kan vi sende indhold af "prøve.txt ” til server ved hjælp af socket-objekt “S”.

SendData = fil.læse (1024)

Læser igen, hvis der er noget tilbage. Så der vil ikke være noget at læse fra filen “SendData” vil være tom, og den kommer ud fra mens loop.

s.tæt()

Dette lukker ikke forbindelsen fra klientsiden.

Ubuntu Screenshots Server side

Ubuntu Screenshots på klientsiden

Testede kombinationer:

  • Linux som server og Linux som klient: PASS
  • Linux som klient og Linux som server: PASS
  • Linux som server og Windows10 som klient: PASS
  • Linux som klient og Windows10 som server: PASS

Anbefalingen er at bruge to Linux-systemer til server og klient.

Forventede fejl:

  1. Du kan se nedenstående fejl, hvis serveren ikke kører på 9898-porten

Traceback (seneste opkald sidst):

Fil "klient.py ", linje 22, i
s.Opret forbindelse ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Forbindelse nægtet
  1. Nedenfor vises fejl, hvis IP-adressen ikke sendes på klientsiden

Kør som

python3-klient.py < serverip address >
  1. Nedenfor vises fejl, hvis 1St argument på klientsiden er ikke en IP-adresse

Traceback (seneste opkald sidst):

Fil "klient.py ", linje 22, i
s.Opret forbindelse ((ServerIp, PORT))
stikkontakt.gaierror: [Errno -2] Navn eller tjeneste kendes ikke
  1. Nedenfor vises fejl, hvis port bruges som 98980

Traceback (seneste opkald sidst):

Fil "klient.py ", linje 22, i
s.Opret forbindelse ((ServerIp, PORT))
OverflowError: getsockaddrarg: port skal være 0-65535.
  1. Nedenfor vises fejl, hvis “prøve.txt ”er ikke til stede på klientsiden.

Traceback (seneste opkald sidst):

Fil "klient.py ", linje 25, i
file = open ("prøve.txt "," rb ")
FileNotFoundError: [Errno 2] Ingen sådan fil eller katalog: 'prøve.txt '

Konklusion:

Ved hjælp af dette program kan vi sende en simpel tekstfil fra et system til et andet system via netværk ved hjælp af python-program. Dette giver os grundlæggende læring af python- og sokkelprogrammering også til afsendelse af data over netværket.

Gratis og open source-spilmotorer til udvikling af Linux-spil
Denne artikel dækker en liste over gratis og open source-spilmotorer, der kan bruges til at udvikle 2D- og 3D-spil på Linux. Der er mange sådanne spil...
Shadow of the Tomb Raider til Linux-vejledning
Shadow of the Tomb Raider er den tolvte tilføjelse til Tomb Raider-serien - en action-adventure-spilfranchise oprettet af Eidos Montreal. Spillet blev...
Sådan styrkes FPS i Linux?
FPS står for Billeder i sekundet. FPS's opgave er at måle billedhastigheden i videoafspilninger eller spiloptræden. I enkle ord betegnes antallet af u...