Pythoni pistikupesa failiedastus Saada

Python Socket File Transfer Send



Selle artikli eesmärk on õppida kuidas tekstifaili võrgu kaudu pythoni programmi kaudu üle kanda . See failiedastus põhineb serveri kliendimudelil, et kasutada pesa programmeerimist python3+-is.

Siin on selle programmi käivitamise põhiskeem.









Lihtsuse huvides nimetame kogu artiklis süsteemi A kui A_klienti ja süsteemi B kui B_serverit.



Failinõuded:

Me vajame server.py ja see fail peaks olema serverisüsteemis olemas. Meie puhul peaks server.py olema süsteemis B_server.





Veel kaks faili client.py ja sample.txt peab olema kliendisüsteemis olemas. Meie puhul peaksid need kaks faili olema A_client süsteemis.

Eeldused:

Siin on eeldused:



  • Meil peaks olema kaks terminali juurdepääsuga Linuxi süsteemi.
  • Eelistatud Linuxi maitse on Ubuntu .
  • Python3 tuleks installida.
  • Mõlemad Linuxi süsteemid peaksid suutma üksteist pingutada. Kasutamine ping käsk ping -i kontrollimiseks.
  • Üks süsteem peaks toimima serverina ja teine ​​süsteem kliendina korraga.

Piirangud:

Enne kui jätkame, peaksime teadma, et sellel programmil on mõned piirangud.

  • Selle programmi käivitamiseks tuleks installida Python3+. Pythoni vanemate versioonidega töötamisel võite täheldada viga või teistsugust käitumist.
  • Selle programmi kaudu saab praegu edastada ainult tekstifaili. Mis tahes muu vormingus fail, mis ei sisalda teksti, võib ebaõnnestuda.
  • Programmis on käsitletud põhilisi programmeerimise erandeid.
  • Programm võib töötada või mitte töötada mõnes muus OS -is peale Ubuntu.
  • Tekstifail peaks kliendi poolel olema lühike, kuna puhvri suurus on 1024 baiti.

Seadistamisnõuded:

  • Selle programmi proovimiseks vajame vähemalt ühte Linuxi süsteemi. Kuid soovitame kasutada kahte erinevat Linuxi süsteemi, mis on võrgu kaudu ühendatud.
  • Kaks süsteemi tuleks ühendada Etherneti või WiFi või muude ühenduste kaudu.

Serveri lähtekood:

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

Kliendi lähtekood:

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

Programmide käitamine ja oodatav väljund:

Siin on sammud programmi käivitamiseks.

Samm: minge süsteemi B_server ja avage terminal. Terminali avamiseks on lühike tee Alt+Ctrl+t.

2. samm. Nüüd minge teele, kus server.py on olemas.

Samm: käivitage nüüd server.py nagu allpool

python3 server.py

Vigu ei tohiks olla ja näete väljatrükke allpool

Server kuvab pordi: 9898

Kopeeritud faili nimi on serveripoolne recv.txt

Samm: avage nüüd terminal A_client süsteemis.

Samm: minge teele, kus on failid client.py ja sample.txt.

Samm: käivitage nüüd client.py nagu allpool

python3 klient.py <B_server süsteemi IP>

Oleme märganud, et peame teadma serveri IP -aadressi. B_server süsteemi IP -aadressi teadmiseks saame täita alltoodud käsu.

ifconfig

Nüüd peaks A_client süsteemi väljund olema selline

################## Allolev teade on serverilt ################
| -------------------------------- |
Tere klient[IP -aadress: 192.168.1.102],
** Tere tulemast serverisse **
-Server
| -------------------------------- |

Samm 7: Nüüd minge saidile B_server ja otsige allpool olevat väljundit

Faili kopeerimine õnnestus
Server sulges ühenduse

Samm: serverikaustas peaks olema üks failinimi recv.txt. Selle recv.txt sisu peaks olema sama sample.txt.

Niisiis oleme edukalt kopeerinud faili kliendilt serverile võrgu kaudu python programmi kaudu.

Koodi selgitused:

Pythoni faile on kaks server.py ja client.py .

Pange tähele, et selgitame üks kord, kas mõni kood on server.py ja client.py sees sama.

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

See on shebangi rida, mis tähendab vaikimisi, et see server.py peaks kasutama python3. Vaatame selle joone ühte eelist.

Oleme käivitanud server.py või client.py nagu python3. Nüüd, ilma python3 kasutamata, saame käivitada pythoni faili. Järgige alltoodud käske

Minge superkasutaja režiimi:

selle

Andke kogu luba .py -failile:

chmod777server.py

Käivitage server.py:

./server.py import pistikupesa
Importiminepistikupesaraamatukogu pythoni programminagume läheme
kasutadapistikupesa eestühendus.

s = pistikupesa.pistikupesa()

Loome objekti s juurdepääs kõigile pistikupesa meetoditele. See on OOP -ide kontseptsioon.

SADAM= 9898

Nüüd valime ühe pordi, kus server kuulab. Selle asemel saame kasutada reserveerimata porti.

s.siduma(('',SADAM))

Kasutame sidumismeetodit, et siduda serveri IP -aadress selle pordiga [9898]. Üks tähelepanek on see, et oleksime võinud sidumismeetodi esimese argumendi asemel kasutada serveri täpset IP -aadressi, kuid otsustame selle tühjaks jätta.

s.siduma((IP-aadress,SADAM))
faili = lahti('recv.txt', 'wb')

Oleme avanud kirjutamisrežiimis serveris ühe failinime recv.txt ja saanud faili kursori. See on vajalik, kuna peame kliendilt kopeerima ühe tekstifaili.

samas Tõsi:

Alustame lõpmatut ajatsüklit, kuna serveri ülesanne on oodata, kuni klient suhtleb selle 9898 pordi serveriga. Nii et see silmus on nõutav.

ühend,lis=s.vastu võtma()

See kood on mõeldud kliendilt sissetulevate ühenduse taotluste vastuvõtmiseks. Conn kasutab ühend suhelda kliendiga ja lis on kliendi IP -aadress, kes on saatnud segamissoovi sellele serverile pordil 9898.

sõnum= ' n n| -------------------------------- | nTere klient [IP -aadress:
'
+ lis[0]+'], n** Tere tulemast serverisse ** n-Server n
| -------------------------------- | n n n'

See kood on mõeldud sõnumi loomiseks kliendile saatmiseks. See teade tuleks printida klienditerminalile. See kinnitab, et klient saab serveriga suhelda.

ühend.saada(sõnumkodeerida())

Nüüd on meil sõnum valmis ja saadame selle kliendile ühend. See kood tegelikult saadab kliendile sõnumi.

RecvData=ühend.recv(1024)

See kood võtab vastu kõik kliendipoolsed andmed. Meie puhul ootame faili sample.txt sisu RecvData .

samasRecvData:

Veel üks aeg, kui tingimus RecvData pole tühi. Meie puhul pole see tühi.

faili.kirjutada(RecvData)

Kui meil on sisu sees RecvData siis kirjutame sellele failile recv.txt kasutades faili kursorit faili.

RecvData=ühend.recv(1024)

Proovin uuesti vastu võtta, kas kliendilt on andmeid. Üks kord RecvData pole andmeid, kood katkestab while -tsükli.

faili.Sulge()

See lihtsalt sulgeb faili kursori, nagu oleme faili kirjutamisega lõpetanud.

ühend.Sulge()

See sulgeb ühenduse kliendiga.

murda

See tuleb B_serveri lõpmatust silmusest.

  1. client.py:
import sys

Sys -teegi importimine soovitud kujul kasutab pythonis argumentide võimalust.

kui (len(sys.argv) > 1):
ServerIp= sys.argv[1]
muidu:
printida(' n nJookse nagu npython3 client.py n n')
väljumine(1)

Kui edastame töötamise ajal B_serveri IP -aadressi pärast failinime client.py, peame selle serveri IP -aadressi kliendist tabama.

… ..If (len (sys.argv)> 1): => Veendumaks, et kasutaja edastab vähemalt ühe argumendi IP -aadressina ja püüab selle IP -aadressi sisestada ServerIP.

Kui kasutaja ei edasta vähemalt ühte argumendikoodi, kuvatakse abi ja tuleb koodist välja.

SADAM= 9898

See peab olema sama port, mida mainiti B_serveri poolel.

s.ühendama((ServerIp,SADAM))

See kood loob selle pordi abil TCP -ühenduse serveri IP -ga. Kõik, mis selles valesti on, toob kaasa ebaõnnestumisi.

faili = lahti('sample.txt', 'rb')

Avame lugemisrežiimis faili sample.txt, et lugeda ainult sisu.

SendData= faili.loe(1024)

Faili sisu lugemine ja sisestamine SendData muutuja.

samasSendData:

Alustame ühe korraga tsüklit, kui SendData on andmeid. Meie juhul, kui fail sample.txt pole tühi, peaks sellel olema andmeid.

s.saada(SendData)

Nüüd saame sisu saata sample.txt serverisse, kasutades pistikupesa objekti s.

SendData= faili.loe(1024)

Lugege uuesti, kui midagi on jäänud. Nii et failist pole midagi lugeda SendData on tühi ja väljub silmusest while.

s.Sulge()

See ei sulge ühendust kliendipoolselt.

Ubuntu ekraanipildid serveripoolne

Ubuntu ekraanipildid kliendipoolne

Testitud kombinatsioonid:

  • Linux serverina ja Linux kliendina: PASS
  • Linux kliendina ja Linux serverina: PASS
  • Linux serverina ja Windows 10 kliendina: PASS
  • Linux kliendina ja Windows 10 serverina: PASS

Soovitatav on serveri ja kliendi jaoks kasutada kahte Linuxi süsteemi.

Oodatud vead:

  1. Allpool näete viga, kui server ei tööta 9898 pordis

Traceback (viimane kõne viimati):

Fail'client.py',rida22, sisse <moodul>
s.ühendama((ServerIp,SADAM))
ConnectionRefusedError:[Ernno111]Ühendusest keelduti
  1. Allpool on näha viga, kui IP -aadressi ei edastata kliendi poolel

Jookse nagu

python3 klient.py <serverip aadress>
  1. Allpool on näha viga, kui 1stargument kliendi poolel ei ole IP -aadress

Traceback (viimane kõne viimati):

Fail'client.py',rida22, sisse <moodul>
s.ühendama((ServerIp,SADAM))
pistikupesa.gaierror:[Ernno -2]Nimivõiteenusmitteteatud
  1. Allolevat viga näete, kui porti kasutatakse näiteks 98980

Traceback (viimane kõne viimati):

Fail'client.py',rida22, sisse <moodul>
s.ühendama((ServerIp,SADAM))
Ülevoolu viga: getsockaddrarg: port peab olema0-65535.
  1. Kui näidis.txt faili kliendi poolel ei kuvata, näete allpool olevat viga.

Traceback (viimane kõne viimati):

Fail'client.py',rida25, sisse <moodul>
faili = lahti('sample.txt', 'rb')
FileNotFoundError:[Ernno2]Ei sellistfaili võikataloog:'sample.txt'

Järeldus:

Selle programmi abil saame python -programmi abil võrgu kaudu saata lihtsa tekstifaili ühest süsteemist teise. See annab meile põhiteadmised pythoni ja pistikupesa programmeerimisest ka andmete edastamiseks võrgu kaudu.