Python Socket File Transfer Send

Python Socket File Transfer Send



Ennek a cikknek a célja a tanulás hogyan lehet szöveges fájlt átvinni hálózaton keresztül a python programon keresztül . Ez a fájlátvitel a szerver ügyfélmodelljén alapul, és a soyt programozást használja a python3+rendszerben.

Itt található az alapvető beállítási diagram a program futtatásához.









Az egyszerűség kedvéért az A rendszert A_kliensnek, a B rendszert pedig B_szervernek fogjuk nevezni a cikkben.



Fájlkövetelmények:

Szükségünk van szerver.py és ennek a fájlnak jelen kell lennie a szerverrendszerben. Esetünkben a server.py -nek a B_server rendszerben kell lennie.





Még két fájl kliens.py és sample.txt jelen kell lennie az ügyfélrendszerben. Esetünkben ennek a két fájlnak jelen kell lennie az A_client rendszerben.

Feltételezések:

Íme a feltételezések:



  • Két Linux -rendszernek kell rendelkeznünk terminálhozzáféréssel.
  • Előnyös Linux íz Ubuntu .
  • Telepíteni kell a Python3 -at.
  • Mindkét Linux rendszernek képesnek kell lennie pingelni egymást. Használat ping parancs a ping ellenőrzésére.
  • Az egyik rendszernek szerverként kell működnie, a másiknak pedig ügyfélként.

Korlátozások:

Mielőtt továbblépnénk, tudnunk kell, hogy ennek a programnak vannak bizonyos korlátai.

  • A program futtatásához telepíteni kell a Python3+ programot. Hibát vagy más viselkedést észlelhet, ha régebbi python verziókon fut.
  • Jelenleg csak szöveges fájlokat lehet átvinni ezen a programon keresztül. Bármilyen más formátumú fájl, amely nem tartalmaz szöveget, sikertelen lehet.
  • Az alapvető programozási kivételeket a program kezelte.
  • A program futhat vagy nem fut más operációs rendszeren, mint Ubuntu.
  • A szövegfájl rövid legyen az ügyféloldalon, mivel 1024 bájtos pufferméretet használtunk.

Állítsa be a követelményeket:

  • A program kipróbálásához legalább egy Linux rendszerre van szükségünk. Ajánlás azonban két különböző Linux rendszer használata, amelyek hálózaton keresztül csatlakoznak.
  • Két rendszert kell Etherneten vagy Wi-Fi-n vagy bármely más kapcsolaton keresztül csatlakoztatni.

Szerver forráskódja:

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

Ügyfél forráskódja:

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

A programok futtatása és a várt kimenet:

Íme a program végrehajtásának lépései.

1. lépés: Nyissa meg a B_server rendszert, és nyisson meg egy terminált. Rövid út a terminál megnyitásához Alt+Ctrl+t.

2. lépés: Most menjen arra az útvonalra, ahol a server.py jelen van.

3. lépés: Most futtassa a server.py -t, mint alább

python3 szerver.py

Nem lehet hiba, és látnia kell az alábbi nyomatokat

A szerver a következő porton jelenik meg: 9898

A másolt fájlnév recv.txt lesz a szerver oldalon

4. lépés: Most nyissa meg a terminált az A_client rendszerben.

5. lépés: Menjen arra az elérési útra, ahol a client.py és a sample.txt fájl megtalálható.

6. lépés: Most futtassa a client.py -t, mint alább

python3 kliens.py <B_szerver rendszer IP>

Megfigyeltük, hogy ismernünk kell a szerver IP -címét. A B_server rendszer IP -címének megismeréséhez végrehajthatjuk az alábbi parancsot.

ifconfig

Most az A_client rendszer kimenetének ilyennek kell lennie

################### Az alábbi üzenet a (z) ################# szervertől érkezett
| --------------------------------- |
Szia Ügyfél[IP -cím: 192.168.1.102],
** Üdvözli a szerver **
-Szerver
| --------------------------------- |

7. lépés: Most menjen a B_server oldalra, és keresse meg az alábbi kimenetet

A fájl sikeres másolása
A szerver lezárta a kapcsolatot

8. lépés: A kiszolgáló mappájában egy fájlnévnek kell lennie. Ennek a recv.txt -nek a minta.txt fájlnak kell lennie.

Tehát sikeresen átmásoltuk a fájlt az ügyfélről a szerverre a hálózaton keresztül python programon keresztül.

A kód magyarázata:

Két python fájl van szerver.py és kliens.py .

Ne feledje, hogy egyszer elmagyarázzuk, ha bármelyik kód ugyanaz a server.py és client.py fájlokban.

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

Ez a shebang sor, ami alapértelmezés szerint azt jelenti, hogy a server.py -nek a python3 -at kell használnia. Lássuk ennek a vonalnak az egyik előnyét.

Végrehajtottuk a szerver.py vagy a client.py hasonlót python3. Most a python3 használata nélkül végrehajthatjuk a python fájlt. Kövesse az alábbi parancsokat

Lépjen szuper felhasználói módba:

annak

Adjon meg minden engedélyt a .py fájlnak:

chmod777szerver.py

Futtassa a server.py fájlt:

./szerver.py import foglalat
Importálásfoglalatkönyvtárat a python programbamintfogunk
használnifoglalat számárakapcsolat.

s = foglalat.foglalat()

Egy objektumot hozunk létre s hogy hozzáférjen az aljzat összes módjához. Ez egy OOP koncepció.

KIKÖTŐ= 9898

Most kiválasztunk egy portot, ahol a szerver figyelni fogja. Ehelyett nem fenntartott portot használhatunk.

s.köt(('',KIKÖTŐ))

Kötési módszerrel kötjük a szerver IP -címét ehhez a porthoz [9898]. Az egyik megfigyelés szerint használhattuk volna a szerver pontos IP -címét a kötési módszer első argumentuma helyett, de úgy döntünk, hogy üresen hagyjuk, mivel ez jól működik.

s.köt((IP-cím,KIKÖTŐ))
fájlt = nyisd ki('recv.txt', 'wb')

Megnyitottuk a recv.txt fájlnevet a kiszolgálón írási módban, és megkaptuk a fájlmutatót. Erre szükség van, mivel egy szövegfájlt kell másolnunk a kliensből.

míg Igaz:

Kezdjünk egy végtelen ciklusot, mivel a szerver feladata megvárni, amíg az ügyfél kommunikál a szerverrel azon a 9898 porton. Tehát ez a ciklus szükséges.

conn,addr=s.elfogad()

Ez a kód elfogadja az ügyfél bejövő csatlakozási kérelmeit. Conn használni fogja conn kommunikálni az ügyféllel és addr annak a kliensnek az IP -címe, aki felfordulási kérelmet küldött erre a 9898 -as portra.

üzenet= ' n n| --------------------------------- | nSzia Ügyfél [IP -cím:
'
+ cím[0]+'], n** Üdvözli a szerver ** n-Szerver n
| --------------------------------- | n n n'

Ez a kód egy üzenet létrehozása, amelyet el kell küldeni az ügyfélnek. Ezt az üzenetet ki kell nyomtatni az ügyfélterminálra. Ez megerősíti, hogy az ügyfél képes kommunikálni a szerverrel.

conn.Küld(üzenetkódol())

Most készen állunk az üzenetre, majd ezt használva elküldjük az ügyfélnek conn. Ez a kód valójában üzenetet küld az ügyfélnek.

RecvData=conn.recv(1024)

Ez a kód fogad minden olyan adatot, amelyet az ügyfél oldaláról küld. Esetünkben a sample.txt tartalmát várjuk RecvData .

mígRecvData:

Még egy ciklus a RecvData feltétellel nem üres. Esetünkben nem üres.

fájlt.ír(RecvData)

Ha már van bennünk tartalom RecvData akkor arra a fájlra írunk recv.txt fájlmutató használatával fájlt.

RecvData=conn.recv(1024)

Ismét megpróbálom megkapni, ha van adat az ügyféltől. Egyszer RecvData nincs adat, a kód megszakítja a while ciklust.

fájlt.Bezárás()

Ez csak bezárja a fájlmutatót, ahogy befejeztük a fájlírást.

conn.Bezárás()

Ez lezárja a kapcsolatot az ügyféllel.

szünet

Ez a B_server végtelen while ciklusából származik.

  1. client.py:
import sys

A sys könyvtár importálása, ahogy akarjuk, használja az argumentum lehetőséget a pythonban.

ha (len(sys.argv) > 1):
ServerIp= sys.argv[1]
más:
nyomtatás(' n nFuss, mint npython3 kliens.py n n')
kijárat(1)

Miközben futás közben átadjuk a B_server IP -címét a client.py fájlnév után, meg kell találnunk a szerver IP -címét a kliensen belül.

… ..If (len (sys.argv)> 1): => Annak biztosítása érdekében, hogy a felhasználó legalább egy argumentumot IP -címként adja meg, és elkapja ezt az IP -címet SzerverIP.

Ha a felhasználó nem adja át, akkor legalább egy argumentumkód súgót mutat, és kilép a kódból.

KIKÖTŐ= 9898

Ennek ugyanaznak a portnak kell lennie, mint a B_szerver oldalán.

s.csatlakozni((ServerIp,KIKÖTŐ))

Ez a kód TCP kapcsolatot létesít az adott porttal rendelkező szerver IP -vel. Bármi rossz ebben a ponintban, kudarcokat eredményez a kapcsolatban.

fájlt = nyisd ki('sample.txt', 'rb')

A sample.txt fájlt olvasási módban nyitjuk meg, hogy csak olvasható tartalmat olvashassunk.

SendData= fájlt.olvas(1024)

A fájl tartalmának olvasása és behelyezése SendData változó.

mígKüldési adatok:

Egy -egy ciklusban kezdünk, ha SendData adatokkal rendelkezik. Esetünkben, ha a sample.txt fájl nem üres, akkor adatokkal kell rendelkeznie.

s.Küld(SendData)

Most küldhetünk tartalmat sample.txt socket objektumot használó szerverre s.

SendData= fájlt.olvas(1024)

Olvasd el újra, hátha maradt valami. Így nem lesz mit olvasni a fájlból SendData üres lesz és a while ciklusból jön ki.

s.Bezárás()

Ez nem zárja le a kapcsolatot ügyfél oldalról.

Ubuntu képernyőképek szerveroldalon

Ubuntu képernyőképek ügyféloldalon

Tesztelt kombinációk:

  • Linux szerverként és Linux kliensként: PASS
  • Linux ügyfélként és Linux szerverként: PASS
  • Linux szerverként és Windows10 kliensként: PASS
  • Linux ügyfélként és Windows10 szerverként: PASS

Ajánlatos két Linux rendszert használni a szerver és az ügyfél számára.

Várható hibák:

  1. Az alábbi hibaüzenetet láthatja, ha a szerver nem fut a 9898 porton

Traceback (legutóbbi utolsó hívás):

Fájl'client.py',vonal22, ban ben <modul>
s.csatlakozni((ServerIp,KIKÖTŐ))
ConnectionRefusedError:[Errno111]kapcsolódás elutasítva
  1. Az alábbi hiba látható, ha az IP -cím nem kerül átadásra az ügyfél oldalán

Fuss, mint

python3 kliens.py <szerver IP cím>
  1. Az alábbi hiba akkor látható, ha 1utcaaz ügyféloldali argumentum nem IP -cím

Traceback (legutóbbi utolsó hívás):

Fájl'client.py',vonal22, ban ben <modul>
s.csatlakozni((ServerIp,KIKÖTŐ))
foglalat.gaierror:[Ernno -2]Névvagyszolgáltatásnemismert
  1. Az alábbi hiba látható, ha a portot 98980 -hoz hasonlóan használják

Traceback (legutóbbi utolsó hívás):

Fájl'client.py',vonal22, ban ben <modul>
s.csatlakozni((ServerIp,KIKÖTŐ))
OverflowError: getsockaddrarg: portnak kell lennie0-65535.
  1. Az alábbi hiba látható, ha a sample.txt fájl nincs jelen az ügyféloldalon.

Traceback (legutóbbi utolsó hívás):

Fájl'client.py',vonal25, ban ben <modul>
fájlt = nyisd ki('sample.txt', 'rb')
FileNotFoundError:[Errno2]Nincs ilyenfájlt vagyKönyvtár:'sample.txt'

Következtetés:

Ezzel a programmal egyszerű szöveges fájlt küldhetünk egyik rendszerről a másikra a hálózaton keresztül a python program segítségével. Ez alapvető ismereteket ad a python és a socket programozásról az adatok hálózaton keresztüli küldéséhez is.