Python

Python Socket File Transfer Lähetä

Python Socket File Transfer Lähetä
Tämän artikkelin tarkoituksena on oppia miten tekstitiedosto siirretään verkon kautta python - ohjelman kautta. Tämä tiedostonsiirto perustuu palvelimen asiakasmalliin, jotta python3: ssa voidaan käyttää socket-ohjelmointia+.

Perustoimintakaavio:

Tässä on perusasetuskaavio tämän ohjelman ajamiseksi.

Yksinkertaisuuden vuoksi kutsumme järjestelmää A nimellä A_client ja järjestelmää B nimellä B_server koko artikkelissa.

Tiedostovaatimukset:

Me tarvitsemme palvelin.py ja tämän tiedoston pitäisi olla läsnä palvelinjärjestelmässä. Meidän tapauksessamme palvelin.py: n tulisi olla B_palvelinjärjestelmässä.

Kaksi muuta tiedostoa asiakas.py ja näyte.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:

Rajoitukset:

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

Määritä vaatimukset:

Palvelimen lähdekoodi:

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

Asiakkaan lähdekoodi:

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

Kuinka ajaa ohjelmia ja odotettu tuotos:

Tässä on vaiheet ohjelman suorittamiseksi.

Vaihe 1: Siirry B_server-järjestelmään ja avaa pääte. Oikopolku päätelaitteen avaamiseksi on Alt + Ctrl + t.

Vaihe 2: Siirry nyt palvelimen polulle.py on läsnä.

Vaihe 3: Suorita nyt palvelin.py kuten alla

python3-palvelin.py

Virheitä ei pitäisi olla, ja sinun pitäisi nähdä alla olevat tulosteet

Palvelin listaa portin: 9898

Kopioidun tiedoston nimi on rekv.txt palvelimen puolella

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

Vaihe 5: Mene asiakkaan polulle.py ja näyte.txt ovat läsnä.

Vaihe 6: Suorita nyt asiakas.py kuten alla

python3-asiakas.py

Olemme havainneet, että meidän on tiedettävä palvelimen IP-osoite. Voimme suorittaa alla olevan komennon tietääksemme B_server-jä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 palvelimeen **
-Palvelin
| -------------------------------- | |

Vaihe 7: Siirry nyt B_server-palvelimeen ja etsi alla oleva lähtö

Tiedosto on kopioitu onnistuneesti
Serveri sulki yhteyden

Vaihe 8: Recv-tiedostonimen pitäisi olla yksi.txt palvelinkansiossa. Tämän suosituksen sisältö.txt: n tulee olla sama näyte.txt.

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

Koodin selitykset:

Python-tiedostoja on kaksi palvelin.py ja asiakas.py.

Huomaa, että selitämme kerran, onko jokin koodi sama palvelimen sisällä.py ja asiakas.py.

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

Tämä on shebang-linja, mikä tarkoittaa oletusarvoisesti tätä palvelinta.py: n tulisi käyttää python3: ta. Katsotaanpa tämän linjan yksi etu.

Olemme suorittaneet palvelimen.py tai asiakas.py kuten python 3 <.py file name>. Nyt ilman python3: ää voimme suorittaa python-tiedoston. Seuraa alla olevia komentoja

Siirry superkäyttäjätilaan:

su

Anna kaikki lupa .py-tiedosto:

chmod 777 -palvelin.py

Suorita palvelin.py:

./ palvelin.py tuontipistoke
Socket-kirjaston tuominen python-ohjelmaan menossa
käyttää liitäntää liitäntään.
s = pistorasia.pistorasia ()

Olemme luomassa objektia "S" käyttää kaikkia liitäntämenetelmiä. Tämä on OOP-konsepti.

PORTTI = 9898

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

s.sitoa ((", PORTTI))

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 sijaan, mutta päätämme jättää tyhjäksi, koska tämä toimii hyvin.

s.sitoa ((IP-osoite, PORTTI))
tiedosto = avoin ("rekv.txt "," wb ")

Olemme avanneet yhden tiedostonimen “recv.txt ”palvelimella kirjoitusmoodia varten ja sai tiedostosoittimen. Tämä vaaditaan, koska meidän on kopioitava yksi tekstitiedosto asiakkaalta.

kun taas totta:

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

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

Tämä koodi hyväksyy kaikki saapuvat yhteyspyynnöt asiakkaalta. Conn käyttääConn ” kommunikoida asiakkaan ja “Addr” on sen asiakkaan IP-osoite, joka on lähettänyt sekoituspyynnön tälle palvelimelle portissa 9898.

msg = "\ n \ n | --------------------------------- | \ n Hei asiakas [IP-osoite:
"+ addr [0] +"], \ n ** Tervetuloa palvelimeen ** \ n -Palvelin \ n
| --------------------------------- | \ n \ n \ n "

Tämän koodin tarkoituksena on luoda viesti, joka lähetetään asiakkaalle. Tämä viesti tulee tulostaa asiakaspäätteelle. Tämä vahvistaa, että asiakas pystyy kommunikoimaan palvelimen kanssa.

Conn.lähetä (viesti.koodata ())

Nyt viesti on valmis ja lähetämme sen sitten asiakkaalle sitä käyttämällä "Conn". Tämä koodi tosiasiallisesti lähettää viestin asiakkaalle.

RecvData = yhteys.suositella (1024)

Tämä koodi vastaanottaa tietoja, jotka lähetetään asiakkaan puolelta. Meidän tapauksessamme odotamme näytteen sisältöä.txt sisään "RecvData".

kun RecvData:

Vielä yksi silmukka ehdolla RecvData ei ole tyhjä. Meidän tapauksessamme se ei ole tyhjä.

tiedosto.kirjoita (RecvData)

Kun meillä on sisältöä sisällä "RecvData" sitten kirjoitamme siihen tiedostoon “Recv.txt ” käyttämällä tiedoston osoitinta "Tiedosto".

RecvData = yhteys.suositella (1024)

Jälleen yritetään vastaanottaa, jos asiakkaalta on tietoja. Kerran "RecvData" ei ole tietoja, koodi rikkoo while-silmukan.

tiedosto.kiinni()

Tämä vain sulkee tiedostosoittimen, kun tiedostojen kirjoittaminen on valmis.

Conn.kiinni()

Tämä sulkee yhteyden asiakkaaseen.

tauko

Tämän on tarkoitus tulla ulos B_palvelimen äärettömästä silmukasta.

  1. asiakas.py:
tuoda sys

Tuodaan sys-kirjasto haluamallamme tavalla python-argumenttitoimintoon.

jos (len (sys.argv)> 1):
ServerIp = sys.argv [1]
muu:
print ("\ n \ n Suorita kuten \ n python3-asiakas.py < serverip address > \ n \ n ")
poistua (1)

Kun välitämme B_palvelimen IP-osoitteen tiedostonimiohjelman jälkeen.Py käynnissä, meidän on löydettävä palvelimen IP-osoite asiakkaan sisällä.

... jos (len (sys.argv)> 1): => Varmistaaksesi, että käyttäjä välittää ainakin yhden argumentin IP-osoitteeksi ja saa kyseisen IP-osoitteen kiinni "ServerIP".

Jos käyttäjä ei läpäise vähintään yhtä argumenttikoodia, ohje näkyy ja tulee ulos koodista.

PORTTI = 9898

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

s.muodosta yhteys ((ServerIp, PORT))

Tämä koodi tekee TCP-yhteyden palvelimen IP-osoitteeseen kyseisen portin kanssa. Mikä tahansa väärä tässä ponintissa johtaa epäonnistumiseen yhteydessä.

tiedosto = open ("näyte.txt "," rb ")

Avaamme “näytteen.txt ”lukutilassa lukeaksesi vain sisältöä.

SendData = tiedosto.lukea (1024)

Tiedoston sisällön lukeminen ja sisällyttäminenLähetä tiedot ” muuttuja.

kun SendData:

Aloitamme yhden hetken silmukan, josLähetä tiedot ” on tietoja. Meidän tapauksessamme, jos “näyte.txt ”ei ole tyhjä, sillä pitäisi olla tietoja.

s.lähetä (SendData)

Nyt voimme lähettää sisältöä "näyte.txt ” palvelimelle käyttämällä socket-objektia "S".

SendData = tiedosto.lukea (1024)

Luen uudelleen, onko mitään jäljellä. Joten ei ole mitään lukea tiedostosta "SendData" on tyhjä ja se tulee ulos while-silmukasta.

s.kiinni()

Tämä ei sulje yhteyttä asiakaspuolelta.

Ubuntu-näyttökuvat palvelimen puolella

Ubuntu Screenshots Client -puoli

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 olevan virheen, jos palvelin ei ole käynnissä 9898-portissa

Seuranta (viimeisin puhelu viimeisin):

Tiedosto "asiakas.py ", rivi 22, sisään
s.muodosta yhteys ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Yhteys hylätty
  1. Alla oleva virhe näkyy, jos IP-osoitetta ei välitetä asiakaspuolella

Suorita kuten

python3-asiakas.py < serverip address >
  1. Alla oleva virhe näkyy, jos 1st Asiakaspuolen argumentti ei ole IP-osoite

Seuranta (viimeisin puhelu viimeisin):

Tiedosto "asiakas.py ", rivi 22, sisään
s.muodosta yhteys ((ServerIp, PORT))
pistorasiaan.gaierror: [Errno -2] Nimeä tai palvelua ei tunneta
  1. Alla oleva virhe näkyy, jos porttia käytetään kuten 98980

Seuranta (viimeisin puhelu viimeisin):

Tiedosto "asiakas.py ", rivi 22, sisään
s.muodosta yhteys ((ServerIp, PORT))
OverflowError: getsockaddrarg: portin on oltava 0-65535.
  1. Alla oleva virhe näkyy, jos “näyte.txt ”ei ole asiakkaan puolella.

Seuranta (viimeisin puhelu viimeisin):

Tiedosto "asiakas.py ", rivi 25, sisään
tiedosto = open ("näyte.txt "," rb ")
FileNotFoundError: [Virhe 2] Ei tällaista tiedostoa tai hakemistoa: 'näyte.txt '

Päätelmä:

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ämiseen verkon kautta.

Top 10 Games to Play on Ubuntu
Windows platform has been one of the dominating platforms for gaming because of the huge percentage of games that are developing today to natively sup...
5 parasta arcade-peliä Linuxille
Nykyään tietokoneet ovat vakavia koneita, joita käytetään pelaamiseen. Jos et pääse uusiin korkeisiin pisteisiin, tiedät mitä tarkoitan. Tässä viestis...
Battle For Wesnoth 1.13.6 Development Released
Battle For Wesnoth 1.13.6 released last month, is the sixth development release in the 1.13.x series and it delivers a number of improvements, most no...