Alapbeállítás diagram:
Itt található a program futtatásához szükséges alapvető beállítási diagram.
Az egyszerűség kedvéért az A rendszert A_kliensként, B rendszert B_szerverként fogjuk hívni a cikkben.
Fájl követelmények:
Szükségünk van szerver.py és ennek a fájlnak jelen kell lennie a szerver rendszeren. Esetünkben szerver.py-nek a B_szerver rendszeren kell lennie.
További két fájl ügyfél.py és minta.txt jelen kell lennie az ügyfélrendszeren. Esetünkben ennek a két fájlnak jelen kell lennie az A_client rendszeren.
Feltételezések:
Itt vannak a feltételezések:
- Két Linux rendszerünk kellene terminálhozzáféréssel.
- Előnyös Linux íz Ubuntu.
- A Python3 programot telepíteni kell.
- Mindkét Linux rendszernek képesnek kell lennie egymás pingelésére. Használat ping
parancs a ping ellenőrzéséhez. - Az egyik rendszernek szerverként kell működnie, a másiknak pedig kliensként kell működnie egy adott időpontban.
Korlátozások:
Mielőtt tovább folytatnánk, tudnunk kell, hogy ennek a programnak vannak bizonyos korlátai.
- A program futtatásához a Python3 + szoftvert kell telepíteni. Előfordulhat, hogy hibát vagy más viselkedést észlel, ha a Python régebbi verzióin futtatja.
- Jelenleg csak szöveges fájlokat lehet átvinni ezen a programon keresztül. Bármely más formátumú fájl, amely nem tartalmaz szöveget, meghibásodhat.
- Az alapvető programozási kivételeket a program kezeli.
- Előfordulhat, hogy a program az Ubuntu kivételével más operációs rendszereken fut.
- A szöveges fájlnak rövidnek kell lennie az ügyfél oldalán, mivel 1024 bájtos pufferméretet használtak.
Állítsa be a követelményeket:
- Legalább egy Linux rendszerre van szükségünk a program kipróbálásához. De ajánlás két különböző Linux rendszer használata, amelyek hálózaton keresztül vannak összekapcsolva.
- Két rendszert Ethernet vagy Wi-Fi hálózaton vagy bármely más kapcsolaton keresztül kell csatlakoztatni.
Szerver forráskód:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / server.py
Kliens forráskód:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / client.py
A programok futtatása és a várható kimenet:
Itt vannak a program végrehajtásának lépései.
1. lépés: Lépjen a B_server rendszerhez, és nyisson meg egy terminált. Parancsikon a terminál megnyitásához Alt + Ctrl + t.
2. lépés: Most menjen a szerver elérési útjára.py jelen van.
3. lépés: Most futtassa a szervert.py, mint lent
python3 szerver.pyNem lehetnek hibák, és az alábbi nyomtatványokat kell látnia
A szerver a 9898-as porton szerepelA másolt fájlnév vissza fog térni.txt a szerver oldalon
4. lépés: Most nyissa meg a terminált az A_client rendszeren.
5. lépés: Menjen arra az útvonalra, ahol az ügyfél.py és minta.txt vannak jelen.
6. lépés: Most futtassa az ügyfelet.py, mint lent
python3 kliens.pyMegfigyeltük, hogy tudnunk kell a szerver IP-címét. Az alábbi parancs végrehajtásával tudjuk tudni a B_server rendszer IP-címét.
ifconfig
Most az A_client rendszer kimenetének ilyennek kell lennie
################## Az alábbi üzenetet a #################### szervertől kaptuk| --------------------------------- |
Kedves kliens [IP-cím: 192.168.1.102],
** Üdvözöljük a szerveren **
-szerver
| -------------------------------- | |
7. lépés: Most lépjen a B_server oldalra, és keresse meg a kimenet alatti értéket
A fájl másolása sikeresen megtörténtA szerver lezárta a kapcsolatot
8. lépés: Egy fájlnévnek kell lennie.txt a szerver mappában. Ennek a recv.A txt-nek azonos mintának kell lennie.txt.
Így sikeresen átmásoltunk egy fájlt a kliensről a szerverre a hálózaton keresztül a Python program segítségével.
Kódmagyarázatok:
Két python fájl van szerver.py és ügyfél.py.
Ne feledje, hogy egyszer elmagyarázzuk, ha bármelyik kód megegyezik-e a szerveren belül.py és kliens.py.
- szerver.py:
Ez a shebang vonal, ami alapértelmezés szerint ezt a szervert jelenti.py-nek a python3-at kell használnia. Lássuk ennek a vonalnak az egyik előnyét.
Futtattuk a szervert.py vagy kliens.py like python3 <.py file name>. A python3 használata nélkül végre tudjuk hajtani a python fájlt. Kövesse az alábbi parancsokat
Lépjen szuperfelhasználói módba:
suAdjon minden engedélyt erre .py fájl:
chmod 777 szerver.pyFuttassa a szervert.py:
./szerver.py import aljzatA socket könyvtár importálása a python programba, menet közben
hogy a csatlakozóaljzatot használja.
s = aljzat.foglalat()
Készítünk egy objektumot „S” a socket minden módszeréhez való hozzáféréshez. Ez egy OOP koncepció.
KIKÖTŐ = 9898Most egy portot választunk, ahol a szerver hallgatni fogja. Ehelyett használhatunk nem fenntartott portot.
s.kötés ((", PORT))Kötési metódust használunk a kiszolgáló ip címének a porthoz való kötésére [9898]. Az egyik megfigyelés szerint használhatnánk 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és ((IP-cím, PORT))file = open ("rekv.txt "," wb ")
Megnyitottunk egy fájlnevet „recv.txt ”a szerveren írási módhoz és fájlmutatót kapott. Erre szükség van, mivel egy szöveges fájlt kell átmásolnunk az ügyfélről.
míg True:Kezdjünk egy végtelen ciklust, mivel a kiszolgáló feladata az, hogy megvárja, amíg az ügyfél kommunikál a kiszolgálóval azon a 9898-as porton. Tehát erre szükség van hurokra.
konn, addr = s.elfogad()Ez a kód az ügyfél minden bejövő csatlakozási kérelmének elfogadására szolgál. Conn a következőt fogja használni:összekötni ” kommunikálni az ügyféllel és „Addr” annak az ügyfélnek az IP-címe, aki a 9898-as porton felkavarási kérést küldött ennek a szervernek.
msg = "\ n \ n | --------------------------------- | \ n Szia kliens [IP-cím:"+ addr [0] +"], \ n ** Üdvözöljük a szerveren ** \ n -Kiszolgáló \ n
| --------------------------------- | \ n \ n \ n "
Ez a kód üzenet létrehozására szolgál, amelyet elküldhet 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.
konn.küldés (msg.kódol())Most készen áll az üzenet, majd ezzel elküldjük az ügyfélnek „Összekötő”. Ez a kód valóban üzenetet küld az ügyfélnek.
RecvData = konn.recv (1024)Ez a kód fogad minden olyan információt, amelyet az ügyfél felől küld. Esetünkben a minta tartalmára számítunk.txt be „RecvData”.
míg a RecvData:Még egy, míg a RecvData feltétellel rendelkező ciklus nem üres. Esetünkben nem üres.
fájl.ír (RecvData)Ha van tartalom bent „RecvData” akkor arra a fájlra írunk „Recv.txt ” fájlmutatóval „Fájl”.
RecvData = konn.recv (1024)Ismét megpróbálunk fogadni, ha van-e adat az ügyféltől. Egyszer „RecvData” nincs adat, a kód megszakítja a while ciklust.
fájl.Bezárás()Ez csak bezárja a fájlmutatót, amint elkészültünk a fájlírással.
konn.Bezárás()Ez lezárja a kapcsolatot az ügyféllel.
szünetEnnek a B_server végtelen ciklusából kell kijönnie.
- ügyfél.py:
A sys könyvtár importálása, ha azt akarjuk, használja az argumentum lehetőséget a pythonban.
ha (len (sys.argv)> 1):ServerIp = sys.argv [1]
más:
print ("\ n \ n Futtassa, mint \ n python3 kliens.py < serverip address > \ n \ n ")
kilépés (1)
Ahogy átadjuk a B_szerver IP-címét a fájlnév ügyfél után.futtatás közben el kell kapnunk a kiszolgáló IP-címét a kliensen belül.
… Ha (len (sys.argv)> 1): => Annak biztosítása, hogy a felhasználó legalább egy argumentumot átadjon IP-címként, és elkapja azt az IP-címet „ServerIP”.
Ha a felhasználó nem ad át legalább egy argumentumkódot, a súgó megjelenik, és kijön a kódból.
KIKÖTŐ = 9898Ennek meg kell egyeznie a B_szerver oldalon említett porttal.
s.connect ((ServerIp, PORT))Ez a kód TCP kapcsolatot létesít a kiszolgáló IP-jével az adott porttal. Bármi rossz ebben a pontról kudarcokat eredményez a kapcsolatban.
file = open ("minta.txt "," rb ")Megnyitjuk a „mintát.txt ”olvasási módban, csak olvasható tartalomhoz.
SendData = fájl.olvasni (1024)A fájl tartalmának elolvasása és behelyezése “SendData ” változó.
míg a SendData:Kezdjük az egy-egy ciklust, haSendData ” rendelkezik adatokkal. Esetünkben, ha „minta.txt ”nem üres, rendelkeznie kell adatokkal.
s.küldés (SendData)Most már elküldhetjük a "minta.txt ” szerverre a socket objektum használatával „S”.
SendData = fájl.olvasni (1024)Ismét elolvasom, ha van még valami. Tehát nem lesz mit olvasni fájlból „SendData” üres lesz, és kijön a while ciklusból.
s.Bezárás()Ez nem zárja le a kapcsolatot kliens oldalról.
Az Ubuntu Screenshots Server oldala
Az Ubuntu Screenshots kliens oldala
Tesztelt kombinációk:
- Linux mint szerver és Linux mint kliens: PASS
- Linux mint kliens és Linux mint szerver: PASS
- Linux mint szerver és Windows10 mint kliens: PASS
- Linux mint kliens és Windows10 mint szerver: PASS
Az ajánlás két Linux rendszer használata szerver és kliens számára.
Várható hibák:
- Az alábbi hibaüzenetet láthatja, ha a kiszolgáló nem fut a 9898-as porton
Traceback (a legutóbbi hívás utoljára):
File "kliens.py ", 22. sor, bes.connect ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] A kapcsolat elutasítva
- Az alábbiakban hiba látható, ha az IP-címet nem adják át az ügyfél oldalon
Fuss, mint
python3 kliens.py < serverip address >- Az alábbiakban hiba látható, ha 1utca Az ügyféloldali argumentum nem IP-cím
Traceback (a legutóbbi hívás utoljára):
File "kliens.py ", 22. sor, bes.connect ((ServerIp, PORT))
foglalat.gaierror: [Errno -2] Név vagy szolgáltatás nem ismert
- Az alábbiakban hiba látható, ha a portot használjuk, mint a 98980
Traceback (a legutóbbi hívás utoljára):
File "kliens.py ", 22. sor, bes.connect ((ServerIp, PORT))
OverflowError: getsockaddrarg: a port értéke 0-65535.
- Az alábbiakban hiba látható, ha a „minta.txt ”nincs jelen az ügyfél oldalán.
Traceback (a legutóbbi hívás utoljára):
File "kliens.py ", 25. sor, befile = open ("minta.txt "," rb ")
FileNotFoundError: [2. hiba] Nincs ilyen fájl vagy könyvtár: 'minta.txt '
Következtetés:
Ennek a programnak a segítségével egy egyszerű szöveges fájlt küldhetünk az egyik rendszerből a másikba a hálózaton keresztül a python program segítségével. Ez lehetővé teszi számunkra a python és a socket programozás alapvető elsajátítását az adatok hálózaton keresztül történő küldéséhez is.