Python Socket File Transfer Send

Python Socket File Transfer Send



Tämän artikkelin tarkoitus on oppia kuinka siirtää tekstitiedosto verkon kautta python -ohjelman kautta . Tämä tiedostonsiirto perustuu palvelinasiakasmalliin pistorasio -ohjelmoinnin käyttämiseksi python3+: ssa.

Tässä on peruskaavio tämän ohjelman suorittamiseksi.









Yksinkertaisuuden vuoksi kutsumme järjestelmää A nimellä A_klient ja järjestelmää B nimellä B_palvelin koko artikkelissa.



Tiedostovaatimukset:

Me tarvitsemme server.py ja tämän tiedoston pitäisi olla läsnä palvelinjärjestelmässä. Meidän tapauksessamme server.py pitäisi olla B_server -järjestelmässä.





Vielä kaksi tiedostoa client.py ja sample.txt pitäisi olla läsnä asiakasjärjestelmässä. Meidän tapauksessamme näiden kahden tiedoston pitäisi olla läsnä A_client -järjestelmässä.

Oletukset:

Tässä ovat oletukset:



  • Meillä pitäisi olla kaksi Linux -järjestelmää päätelaitteella.
  • Edullinen Linux -maku on Ubuntu .
  • Python3 on asennettava.
  • Molempien Linux -järjestelmien pitäisi pystyä pingaamaan toisiaan. Käyttää ping komento tarkistaa ping.
  • Yhden järjestelmän pitäisi toimia palvelimena ja toisen järjestelmän tulee toimia asiakkaana tiettynä aikana.

Rajoitukset:

Ennen kuin jatkamme eteenpäin, meidän on tiedettävä, että tällä ohjelmalla on joitain rajoituksia.

  • Python3+ on asennettava tämän ohjelman suorittamiseksi. Saatat havaita virheen tai erilaisen käyttäytymisen, jos sitä käytetään python -vanhemmissa versioissa.
  • Vain tekstitiedostoja voidaan siirtää tämän ohjelman kautta toistaiseksi. Kaikki muut tiedostot, jotka eivät sisällä tekstiä, voivat epäonnistua.
  • Ohjelmoinnin peruspoikkeuksia on käsitelty ohjelmassa.
  • Ohjelma voi toimia tai olla käyttämättä muissa käyttöjärjestelmissä kuin Ubuntu.
  • Tekstitiedoston tulee olla lyhyt asiakaspuolella, koska puskurikokoa on käytetty 1024 tavua.

Määritä vaatimukset:

  • Tarvitsemme vähintään yhden Linux -järjestelmän kokeillaksemme tätä ohjelmaa. Mutta suositus on käyttää kahta erilaista Linux -järjestelmää, jotka on yhdistetty verkon kautta.
  • Kaksi järjestelmää on yhdistettävä Ethernetin tai Wi-Fi: n tai muiden yhteyksien kautta.

Palvelimen lähdekoodi:

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

Asiakkaan lähdekoodi:

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

Ohjelmien suorittaminen ja odotettu tulostus:

Tässä on vaiheet ohjelman suorittamiseksi.

Vaihe 1: Siirry B_server -järjestelmään ja avaa pääte. Pikaopas terminaalin avaamiseen on Alt+Ctrl+t.

Vaihe 2: Siirry nyt polulle, jossa server.py on läsnä.

Vaihe 3: Suorita nyt server.py kuten alla

python3 palvelin.py

Virheitä ei pitäisi olla, ja tulosteiden pitäisi näkyä alla

Palvelin ilmoittaa portista: 9898

Kopioidun tiedoston nimi on recv.txt palvelimen puolella

Vaihe 4: Avaa nyt terminaali A_client -järjestelmässä.

Vaihe 5: Siirry polulle, jossa client.py ja sample.txt ovat läsnä.

Vaihe 6: Suorita nyt client.py kuten alla

python3 -asiakas.py <B_palvelinjärjestelmän IP>

Olemme havainneet, että meidän on tiedettävä palvelimen IP -osoite. Voimme suorittaa alla olevan komennon tietääksemme B_palvelinjärjestelmän IP -osoitteen.

ifconfig

Nyt A_client -järjestelmän ulostulon pitäisi olla tällainen

################## Alla oleva viesti vastaanotetaan palvelimelta #################
| -------------------------------- |
Hei Asiakas[IP -osoite: 192.168.1.102],
** Tervetuloa palvelimelle **
-Palvelin
| -------------------------------- |

Vaihe 7: Siirry nyt B_palvelimeen ja etsi alla olevaa tuotosta

Tiedoston kopioiminen onnistui
Serveri sulki yhteyden

Vaihe 8: Palvelinkansiossa pitäisi olla yksi tiedostonimi recv.txt. Tämän recv.txt -tiedoston sisällön on oltava sama sample.txt.

Joten olemme onnistuneesti kopioineet tiedoston asiakkaalta palvelimelle verkon kautta python -ohjelman kautta.

Koodin selitykset:

Python -tiedostoja on kaksi server.py ja client.py .

Huomaa, että selitämme kerran, onko jokin koodi sama server.py- ja client.py -tiedostoissa.

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

Tämä on shebang -rivi, joka tarkoittaa oletusarvoisesti tämän palvelimen.py pitäisi käyttää python3. Katsotaanpa yksi tämän linjan etu.

Olemme suorittaneet kuten server.py tai client.py python3. Nyt ilman python3: ta voimme suorittaa python -tiedoston. Noudata alla olevia komentoja

Siirry pääkäyttäjätilaan:

sen

Anna kaikki oikeudet .py -tiedostoon:

chmod777palvelin.py

Suorita server.py:

./palvelin.py tuonti pistorasia
Tuontipistorasiakirjastosta python -ohjelmaankutenme olemme menossa
käyttääpistorasia vartenyhteys.

s = pistorasia.pistorasia()

Luomme objektia s käyttää kaikkia pistorasiatapoja. Tämä on OOP -käsite.

SATAMA= 9898

Nyt valitsemme yhden portin, jossa palvelin kuuntelee. Voimme käyttää varaamatonta porttia tämän sijaan.

s.sitoa(('',SATAMA))

Sidomme palvelimen IP -osoitteen kyseiseen porttiin sidontamenetelmällä [9898]. Yksi havainto on, että olisimme voineet käyttää palvelimen tarkkaa IP -osoitetta sidontamenetelmän ensimmäisen argumentin sijasta, mutta päätämme jättää tyhjäksi, koska tämä toimii hyvin.

s.sitoa((IP-osoite,SATAMA))
tiedosto = avata('recv.txt', 'wb')

Olemme avanneet palvelimella yhden tiedostonimen recv.txt kirjoitustilaan ja saaneet tiedoston osoittimen. Tämä on pakollista, koska meidän on kopioitava yksi tekstitiedosto asiakkaalta.

sillä aikaa Totta:

Aloitetaan yksi ääretön silmukka, koska palvelimen tehtävänä on odottaa, kunnes asiakas on yhteydessä 9898 -portin palvelimeen. Joten tämä samalla silmukka vaaditaan.

yhdistä,addr=s.hyväksyä()

Tämä koodi on hyväksyttävä kaikki saapuvat yhteyspyynnöt asiakkaalta. Conn käyttää yhdistä kommunikoida asiakkaan kanssa ja addr on sen asiakkaan IP -osoite, joka on lähettänyt häiriöpyynnön tälle palvelimelle portilla 9898.

viesti= '' n n| -------------------------------- | nHei asiakas [IP -osoite:
''
+ osoite[0]+'], n** Tervetuloa palvelimelle ** n-Palvelin n
| -------------------------------- | n n n''

Tämä koodi on luoda viesti, joka lähetetään asiakkaalle. Tämä viesti on tulostettava asiakaspäätteeseen. Tämä vahvistaa, että asiakas pystyy kommunikoimaan palvelimen kanssa.

yhdistälähettää(viestikoodata())

Nyt meillä on viesti valmis ja lähetämme sen sitten asiakkaalle sitä käyttäen yhdistä Tämä koodi todella lähettää viestin asiakkaalle.

RecvData=yhdistärecv(1024)

Tämä koodi vastaanottaa kaikki tiedot, jotka lähetetään asiakaspuolelta. Meidän tapauksessamme odotamme sample.txt -tiedoston sisältöä RecvData .

sillä aikaaRecvData:

Vielä yksi silmukka, jossa ehto RecvData ei ole tyhjä. Meidän tapauksessamme se ei ole tyhjä.

tiedosto.kirjoittaa(RecvData)

Kun meillä on sisältöä sisällä RecvData sitten kirjoitamme siihen tiedostoon recv.txt käyttämällä tiedoston osoitinta tiedosto.

RecvData=yhdistärecv(1024)

Yritän jälleen vastaanottaa, onko asiakkaalta tietoja. Kerran RecvData ei ole tietoja, koodi rikkoo while -silmukan.

tiedosto.kiinni()

Tämä vain sulkee tiedoston osoittimen, kun olemme tehneet tiedoston kirjoittamisen.

yhdistäkiinni()

Tämä sulkee yhteyden asiakkaan kanssa.

tauko

Tämä tulee ulos loputtomasta silmukasta B_palvelimessa.

  1. client.py:
tuonti sys

Kun tuomme sys -kirjaston haluamallamme tavalla, käytämme argumenttimahdollisuutta pythonissa.

jos (len(sys.argv) > 1):
PalvelinIp= sys.argv[1]
muu:
Tulosta('' n nJuokse kuten npython3 client.py n n'')
poistua(1)

Kun välitämme B_palvelimen IP -osoitteen tiedostonimen client.py jälkeen käynnissä, meidän on otettava palvelimen IP -osoite asiakkaan sisältä.

… ..If (len (sys.argv)> 1): => Varmistaaksesi, että käyttäjä välittää vähintään yhden argumentin IP -osoitteena ja ottaa sen IP -osoitteen sisään PalvelinIP.

Jos käyttäjä ei välitä, vähintään yksi argumenttikoodi näyttää apua ja tulee ulos koodista.

SATAMA= 9898

Tämän on oltava sama portti kuin B_palvelimen puolella.

s.kytkeä((PalvelinIp,SATAMA))

Tämä koodi muodostaa TCP -yhteyden palvelimen IP -osoitteeseen kyseisen portin kanssa. Mikä tahansa vika tässä ponintissa johtaa epäonnistumisiin yhteydessä.

tiedosto = avata('sample.txt', 'rb')

Avaamme sample.txt -tiedoston lukutilassa vain luettavaa sisältöä varten.

Lähetä tiedot= tiedosto.lukea(1024)

Tiedoston sisällön lukeminen ja sisällyttäminen Lähetä tiedot muuttuja.

sillä aikaaLähetä tiedot:

Aloitamme yhden silmukan, jos Lähetä tiedot on dataa. Meidän tapauksessamme, jos sample.txt -tiedosto ei ole tyhjä, sen pitäisi sisältää tietoja.

s.lähettää(Lähetä tiedot)

Nyt voimme lähettää sisältöä sample.txt palvelimelle socket -objektin avulla s.

Lähetä tiedot= tiedosto.lukea(1024)

Lue uudelleen, jos jotain on jäljellä. Tiedostosta ei siis lue mitään Lähetä tiedot on tyhjä ja se tulee ulos silmukasta.

s.kiinni()

Tämä ei sulje yhteyttä asiakaspuolelta.

Ubuntu Screenshots Palvelinpuoli

Ubuntun kuvakaappaukset asiakaspuolella

Testatut yhdistelmät:

  • Linux palvelimena ja Linux asiakkaana: PASS
  • Linux asiakkaana ja Linux palvelimena: PASS
  • Linux palvelimena ja Windows10 asiakkaana: PASS
  • Linux asiakkaana ja Windows10 palvelimena: PASS

Suositus on käyttää kahta Linux -järjestelmää palvelimelle ja asiakkaalle.

Odotetut virheet:

  1. Näet alla virheen, jos palvelin ei ole käynnissä 9898 -portissa

Traceback (viimeisin puhelu viimeksi):

Tiedosto'client.py',linja22, sisään <moduuli>
s.kytkeä((PalvelinIp,SATAMA))
ConnectionRefusedError:[Errno111]yhteys evätty
  1. Alla oleva virhe näkyy, jos IP -osoitetta ei välitetä asiakaspuolella

Juokse kuten

python3 -asiakas.py <palvelimen IP-osoite>
  1. Alla oleva virhe näkyy, jos 1stargumentti asiakkaan puolella ei ole IP -osoite

Traceback (viimeisin puhelu viimeksi):

Tiedosto'client.py',linja22, sisään <moduuli>
s.kytkeä((PalvelinIp,SATAMA))
pistorasia.gaierror:[Errno -2]Nimitaipalvelueitiedossa
  1. Alla oleva virhe näkyy, jos porttia käytetään kuten 98980

Traceback (viimeisin puhelu viimeksi):

Tiedosto'client.py',linja22, sisään <moduuli>
s.kytkeä((PalvelinIp,SATAMA))
Ylivuotovirhe: getsockaddrarg: portin on oltava0-65535.
  1. Alla oleva virhe näkyy, jos sample.txt -tiedostoa ei ole asiakaspuolella.

Traceback (viimeisin puhelu viimeksi):

Tiedosto'client.py',linja25, sisään <moduuli>
tiedosto = avata('sample.txt', 'rb')
FileNotFoundError:[Errno2]Ei sellaistatiedosto taihakemisto:'sample.txt'

Johtopäätös:

Tämän ohjelman avulla voimme lähettää yksinkertaisen tekstitiedoston järjestelmästä toiseen järjestelmään verkon kautta python -ohjelman avulla. Tämä antaa meille perusopetuksen python- ja socket -ohjelmoinnista myös tietojen lähettämiseksi verkon kautta.