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.pyNem lehet hiba, és látnia kell az alábbi nyomatokat
A szerver a következő porton jelenik meg: 9898A 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ásaA 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.
- server.py:
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:
annakAdjon meg minden engedélyt a .py fájlnak:
chmod777szerver.pyFuttassa a server.py fájlt:
./szerver.py import foglalatImportá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Ő= 9898Most 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ünetEz a B_server végtelen while ciklusából származik.
- client.py:
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Ő= 9898Ennek 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:
- 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
- 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>- 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
- 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.
- 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.