Skicka Python Socket -filöverföring

Python Socket File Transfer Send



Avsikten med denna artikel är att lära sig hur man överför en textfil över nätverket via python -program . Denna filöverföring är baserad på serverklientmodell för att använda socketprogrammering i python3+.

Här är det grundläggande konfigurationsdiagrammet för att köra detta program.









För enkelhetens skull kommer vi att kalla System A som A_client och System B som B_server i hela artikeln.



Filkrav:

Vi behöver server.py och den här filen ska finnas på serversystemet. I vårt fall ska server.py vara på B_serversystem.





Ytterligare två filer client.py och sample.txt bör finnas i klientsystemet. I vårt fall bör dessa två filer finnas på A_client -systemet.

Antaganden:

Här är antagandena:



  • Vi borde ha två Linux -system med terminalåtkomst.
  • Föredragen Linux -smak är Ubuntu .
  • Python3 bör installeras.
  • Båda Linux -systemen borde kunna pinga varandra. Använda sig av ping kommando för att kontrollera ping.
  • Ett system bör fungera som server och ett annat system ska fungera som klient vid en viss tidpunkt.

Begränsningar:

Innan vi går vidare bör vi veta att det finns vissa begränsningar för detta program.

  • Python3+ bör installeras för att köra detta program. Du kan observera fel eller annat beteende om du kör på python äldre versioner.
  • Endast textfil kan överföras via detta program från och med nu. Alla andra formatfiler som inte innehåller text kan misslyckas.
  • Grundläggande programmeringsundantag har hanterats i programmet.
  • Programmet kanske körs på annat operativsystem än Ubuntu.
  • Textfilen ska vara kort på klientsidan eftersom buffertstorlek på 1024 byte har använts.

Ställ in krav:

  • Vi behöver minst ett Linux -system för att testa detta program. Men rekommendationen är att använda två olika Linux -system som är anslutna via nätverk.
  • Två system bör anslutas via Ethernet eller Wi-Fi eller andra anslutningar.

Serverns källkod:

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

Kundens källkod:

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

Så här kör du program och förväntad produktion:

Här är stegen för att köra programmet.

Steg 1: Gå till B_serversystem och öppna en terminal. Genväg för att öppna en terminal är Alt+Ctrl+t.

Steg 2: Gå nu till vägen där server.py finns.

Step3: Kör nu server.py som nedan

python3 -server.py

Det ska inte vara några fel och du bör se nedanstående utskrifter

Servern är listad på port: 9898

Kopierat filnamn kommer recv.txt på serversidan

Steg 4: Öppna nu terminalen på A_client -systemet.

Steg 5: Gå till sökvägen där client.py och sample.txt finns.

Steg 6: Kör nu client.py som nedan

python3 -klient.py <B_serversystemets IP>

Vi har observerat att vi behöver känna till serverns IP -adress. Vi kan utföra kommandot nedan för att veta IP -adressen för B_serversystem.

ifconfig

Nu bör utdata från A_client -systemet vara så här

################### Nedanstående meddelande tas emot från servern ###################
| --------------------------------- |
Hej kund[IP -adress: 192.168.1.102],
** Välkommen till servern **
-Server
| --------------------------------- |

Steg 7: Gå nu till B_server och leta efter utdata nedan

Filen har kopierats
Servern stängde uppkopplingen

Steg 8: Det bör finnas ett filnamn recv.txt i servermappen. Innehållet i denna recv.txt bör vara samma sample.txt.

Så vi har framgångsrikt kopierat en fil från klient till server via nätverk via python -program.

Kodförklaringar:

Det finns två python -filer server.py och client.py .

Observera att vi kommer att förklara en gång om någon kod är densamma inuti server.py och client.py.

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

Detta är en shebang -linje, vilket innebär att denna server. Py som standard bör använda python3. Låt oss se en fördel med den här raden.

Vi har kört server.py eller client.py som python3. Nu utan att använda python3 kan vi köra python -filen. Följ kommandona nedan

Gå till superanvändarläge:

dess

Ge all behörighet till .py -fil:

chmod777server.py

Kör server.py:

./server.py importera uttag
Importeraruttagbibliotek till python -programsomvi går
att användauttag förförbindelse.

s = uttag.uttag()

Vi skapar ett objekt s för att komma åt alla metoder för uttag. Detta är ett OOP -koncept.

HAMN= 9898

Nu väljer vi en port där servern ska lyssna. Vi kan använda en icke reserverad port istället för denna.

s.binda(('',HAMN))

Vi använder bindningsmetod för att binda serverns ip -adress till den porten [9898]. En observation är att vi kunde ha använt exakt IP -adress för servern istället för första argumentet för bindningsmetod men vi väljer att lämna tomt eftersom det fungerar bra.

s.binda((IP-adress,HAMN))
fil = öppen('recv.txt', 'wb')

Vi har öppnat ett filnamn recv.txt i servern för skrivläge och fick filpekare. Detta krävs eftersom vi måste kopiera en textfil från klienten.

medan Sann:

Låt oss starta en oändlig medan loop som serverns jobb är att vänta tills en klient kommunicerar med servern på den 9898 -porten. Så detta medan loop krävs.

anslut,addr=s.acceptera()

Denna kod är för att acceptera alla inkommande anslutningsförfrågningar från klienten. Conn kommer att använda anslut att kommunicera med klienten och addr är IP -adressen till klienten som har skickat uppståndelsebegäran till denna server på port 9898.

meddelande= ' n n| --------------------------------- | nHej klient [IP -adress:
'
+ addr[0]+'], n** Välkommen till servern ** n-Server n
| --------------------------------- | n n n'

Denna kod är för att skapa ett meddelande som ska skickas till klienten. Detta meddelande ska skrivas ut på klientterminalen. Detta bekräftar att klienten kan kommunicera med servern.

anslut.skicka(meddelandekoda())

Nu har vi meddelandet klart och skickar det sedan till klienten med det anslut. Denna kod skickar faktiskt meddelande till klienten.

RecvData=anslut.recv(1024)

Denna kod tar emot all data som skickas från klientsidan. I vårt fall förväntar vi oss innehållet i sample.txt in RecvData .

medanRecvData:

En till medan loop med villkor RecvData inte är tom. I vårt fall är det inte tomt.

fil.skriva(RecvData)

När vi har innehåll inne RecvData då skriver vi till den filen recv.txt med hjälp av filpekare fil.

RecvData=anslut.recv(1024)

Återigen försöker ta emot om det finns data från klienten. En gång RecvData har ingen data kommer koden att bryta medan loop.

fil.stänga()

Detta stänger bara filpekaren när vi är klara med filskrivning.

anslut.stänga()

Detta kommer att stänga anslutningen till klienten.

ha sönder

Detta kommer att komma ut från oändlig medan loop på B_server.

  1. client.py:
importera sys

Importera sys -bibliotek som vi vill använda argumentfunktionen i python.

om (len(sys.argv) > 1):
ServerIp= sys.argv[1]
annan:
skriva ut(' n nSpring som npython3 client.py n n')
utgång(1)

När vi skickar IP -adressen för B_server efter filnamnet client.py medan vi kör, måste vi fånga serverns IP -adress inuti klienten.

... ..if (len (sys.argv)> 1): => För att säkerställa att användaren skickar minst ett argument som IP -adress och fånga den IP -adressen insdie ServerIP.

Om användaren inte skickar åtminstone en argumentkod visar hjälp och kommer ut från koden.

HAMN= 9898

Detta måste vara samma port som nämns på B_serversidan.

s.ansluta((ServerIp,HAMN))

Denna kod gör TCP -anslutning till serverns IP med den porten. Allt fel vid denna ponint resulterar i misslyckanden i anslutningen.

fil = öppen('sample.txt', 'rb')

Vi öppnar sample.txt i läsläge för att bara läsa innehåll.

Skicka data= fil.läsa(1024)

Läser innehållet i filen och lägger in den Skicka data variabel.

medanSkicka data:

Vi börjar en while loop om Skicka data har data. I vårt fall om sample.txt inte är tomt bör det ha data.

s.skicka(Skicka data)

Nu kan vi skicka innehåll av sample.txt till servern med socketobjekt s.

Skicka data= fil.läsa(1024)

Återigen läser om det finns något kvar. Så det blir inget att läsa från filen Skicka data kommer att vara tomt och det kommer ut från medan loop.

s.stänga()

Detta stänger inte anslutningen från klientsidan.

Ubuntu Screenshots Server sida

Ubuntu Screenshots Klientsida

Testade kombinationer:

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

Rekommendationen är att använda två Linux -system för server och klient.

Förväntade fel:

  1. Du kan se nedanstående fel om servern inte körs på 9898 -porten

Spår tillbaka (senaste samtal senast):

Fil'client.py',linje22, i <modul>
s.ansluta((ServerIp,HAMN))
ConnectionRefusedError:[Errno111]Anslutning nekades
  1. Nedanstående fel visas om IP -adressen inte skickas på klientsidan

Spring som

python3 -klient.py <server IP adress>
  1. Nedanstående fel visas om 1stargumentet på klientsidan är inte en IP -adress

Spår tillbaka (senaste samtal senast):

Fil'client.py',linje22, i <modul>
s.ansluta((ServerIp,HAMN))
uttag.gaierror:[Errno -2]namnellerserviceintekänd
  1. Felet nedan visas om porten används som 98980

Spår tillbaka (senaste samtal senast):

Fil'client.py',linje22, i <modul>
s.ansluta((ServerIp,HAMN))
Överflödesfel: getsockaddrarg: porten måste vara0-65535.
  1. Nedanstående fel visas om sample.txt inte finns på klientsidan.

Spår tillbaka (senaste samtal senast):

Fil'client.py',linje25, i <modul>
fil = öppen('sample.txt', 'rb')
FileNotFoundError:[Errno2]Ingen sådanfil ellerkatalog:'sample.txt'

Slutsats:

Med hjälp av detta program kan vi skicka en enkel textfil från ett system till ett annat system via nätverk med hjälp av python -program. Detta ger oss grundläggande inlärning av python- och socketprogrammering även för att skicka data över nätverk.