Enviament de transferència de fitxers de socket Python

Python Socket File Transfer Send



La intenció d’aquest article és aprendre com transferir un fitxer de text a la xarxa a través del programa Python . Aquesta transferència de fitxers es basa en el model de client del servidor per utilitzar la programació de sòcol a python3 +.

Aquí teniu el diagrama bàsic de configuració per executar aquest programa.









Per simplificar, anomenarem el sistema A com a client_A i el sistema B com a servidor_B al llarg de l’article.



Requisits del fitxer:

Necessitem server.py i aquest fitxer hauria d'estar present al sistema del servidor. En el nostre cas, server.py hauria d'estar al sistema B_server.





Dos fitxers més client.py i sample.txt hauria d’estar present al sistema client. En el nostre cas, aquests dos fitxers haurien d’estar presents al sistema A_client.

Supòsits:

Aquests són els supòsits:



  • Hauríem de tenir dos sistemes Linux amb accés al terminal.
  • El sabor Linux preferible és Ubuntu .
  • S'hauria d'instal·lar Python3.
  • Tots dos sistemes Linux haurien de poder fer ping entre ells. Ús ping ordre per comprovar ping.
  • Un sistema hauria d’actuar com a servidor i un altre sistema hauria d’actuar com a client alhora.

Limitacions:

Abans de continuar, hem de saber que hi ha algunes limitacions d’aquest programa.

  • S'hauria d'instal·lar Python3 + per executar aquest programa. Podeu observar errors o comportaments diferents si s'executen en versions anteriors de Python.
  • A partir d’aquest moment, només es pot transferir un fitxer de text a través d’aquest programa. Pot fallar qualsevol altre fitxer de format que no contingui text.
  • Al programa s’han gestionat excepcions bàsiques de programació.
  • El programa pot funcionar o no en un altre sistema operatiu que no sigui Ubuntu.
  • El fitxer de text hauria de ser curt al costat del client ja que s’ha utilitzat una mida de memòria intermèdia de 1024 bytes.

Configureu els requisits:

  • Necessitem almenys un sistema Linux per provar aquest programa. Però la recomanació és utilitzar dos sistemes Linux diferents que estiguin connectats a través de la xarxa.
  • Cal connectar dos sistemes mitjançant Ethernet, Wi-Fi o qualsevol altra connexió.

Codi font del servidor:

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

Codi font del client:

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

Com executar els programes i la sortida esperada:

Aquests són els passos per executar el programa.

Pas 1: aneu al sistema B_server i obriu un terminal. La drecera per obrir un terminal és Alt + Ctrl + t.

Pas 2: ara aneu pel camí on hi ha server.py.

Pas 3: ara executeu server.py com es mostra a continuació

servidor python3.py

No hi hauria d’haver cap error i hauríeu de veure impressions a continuació

El servidor apareix al port: 9898

El nom del fitxer copiat serà recv.txt al costat del servidor

Pas 4: ara obriu el terminal al sistema A_client.

Pas 5: aneu al camí on hi ha client.py i sample.txt.

Pas 6: ara executeu client.py com es mostra a continuació

client python3.py <IP del sistema B_server>

Hem observat que hem de conèixer l'adreça IP del servidor. Podem executar l'ordre següent per conèixer l'adreça IP del sistema B_server.

ifconfig

Ara la sortida del sistema A_client hauria de ser així

################## A continuació es rep el missatge del servidor ###################
| --------------------------------- |
Hi Client[Adreça IP: 192.168.1.102],
** Benvingut al servidor **
-Servei
| --------------------------------- |

Pas 7: ara aneu a B_server i busqueu la sortida següent

El fitxer s'ha copiat correctament
El servidor ha tancat la connexió

Pas 8: hi ha d'haver un nom de fitxer recv.txt a la carpeta del servidor. El contingut d’aquest recv.txt hauria de ser el mateix sample.txt.

Per tant, hem copiat amb èxit un fitxer de client a servidor a través de la xarxa mitjançant el programa Python.

Explicacions del codi:

Hi ha dos fitxers python server.py i client.py .

Tingueu en compte que explicarem una vegada si algun codi és el mateix dins de server.py i client.py.

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

Aquesta és una línia de shebang que significa que per defecte aquest server.py hauria d'utilitzar python3. Vegem un avantatge d’aquesta línia.

Hem executat el servidor.py o client.py com python3. Ara sense utilitzar python3 podem executar el fitxer python. Seguiu les ordres següents

Ves al mode de superusuari:

seva

Doneu tot permís al fitxer .py:

chmod777servidor.py

Executeu server.py:

./servidor.py importació endoll
Importantendollbiblioteca al programa Pythoncomestem anant
usarendoll perconnexió.

s = endoll.endoll()

Estem creant un objecte s per accedir a tots els mètodes de socket. Aquest és un concepte OOPs.

PORT= 9898

Ara escollim un port on escoltarà el servidor. Podem fer servir port no reservat en lloc d’aquest.

s.lligar(('',PORT))

Utilitzem el mètode bind per vincular l'adreça IP del servidor a aquest port [9898]. Una observació és que podríem haver utilitzat l'adreça IP exacta del servidor en lloc del primer argument del mètode de vinculació, però decidim deixar-ho en blanc, ja que funciona bé.

s.lligar((adreça IP,PORT))
dossier = obert('recv.txt', 'wb')

Hem obert un nom de fitxer recv.txt al servidor per al mode d’escriptura i hem aconseguit el punter del fitxer. Això és obligatori, ja que hem de copiar un fitxer de text del client.

mentre És cert:

Comencem un bucle infinit mentre la feina del servidor és esperar fins que un client es comuniqui amb el servidor en aquest port 9898. Per tant, aquest bucle while és obligatori.

conn,addr=s.acceptar()

Aquest codi permet acceptar qualsevol sol·licitud de connexió entrant del client. Conn utilitzarà conn per comunicar-se amb el client i addr és l'adreça IP del client que ha enviat una sol·licitud de commoció a aquest servidor al port 9898.

msg= ' n n| --------------------------------- | nHola client [adreça IP:
'
+ addr[0]+'], n** Benvingut al servidor ** n-Servei n
| --------------------------------- | n n n'

Aquest codi és per crear un missatge per enviar al client. Aquest missatge s'hauria d'imprimir al terminal del client. Això confirma que el client és capaç de comunicar-se amb el servidor.

conn.enviar(msg.codificar())

Ara ja tenim el missatge a punt i l’enviem al client que l’utilitza conn. Aquest codi realment envia un missatge al client.

RecvData=conn.recv(1024)

Aquest codi rep totes les dades que s’envien des del client. En el nostre cas, esperem el contingut de sample.txt a RecvData .

mentreRecvData:

Un bucle mentre més amb la condició RecvData no està buit. En el nostre cas no està buit.

dossier.escriure(RecvData)

Un cop tinguem contingut a dins RecvData llavors estem escrivint a aquest fitxer recv.txt utilitzant el punter de fitxers dossier.

RecvData=conn.recv(1024)

Torneu a intentar rebre si hi ha dades del client. Un cop RecvData no té dades, el codi trencarà el bucle while.

dossier.Tanca()

Això només tancarà el punter del fitxer, ja que acabem amb l'escriptura de fitxers.

conn.Tanca()

Això tancarà la connexió amb el client.

trencar

Això ha de sortir d'un bucle infinit mentre que a B_server.

  1. client.py:
importació sys

La importació de la biblioteca sys com vulguem utilitza la funció d’arguments a Python.

si (len(sys.argv) > 1):
ServerIp= sys.argv[1]
en cas contrari:
imprimir(' n nCórrer com npython3 client.py n n')
sortir(1)

Quan passem l'adreça IP de B_server després del nom de fitxer client.py mentre s'executa, hem de capturar l'adreça IP del servidor dins del client.

... ..if (len (sys.argv)> 1): => Per assegurar-se que l'usuari passi almenys un argument com a adreça IP i capturi l'adreça IP insdie Servidor IP.

Si l'usuari no passa almenys un argument, el codi mostra ajuda i surt del codi.

PORT= 9898

Aquest ha de ser el mateix port que l’esmentat al costat del servidor B_.

s.connectar((ServerIp,PORT))

Aquest codi farà la connexió TCP a la IP del servidor amb aquest port. Qualsevol cosa que passi malament en aquest punt es tradueix en fallades de connexió.

dossier = obert('sample.txt', 'rb')

Obrim sample.txt en mode de lectura per llegir només contingut.

Envia dades= dossier.llegir(1024)

Llegir el contingut del fitxer i posar-lo dins Envia dades variable.

mentreEnvia dades:

Comencem un bucle while si Envia dades té dades. En el nostre cas, si sample.txt no està buit, hauria de contenir dades.

s.enviar(Envia dades)

Ara podem enviar contingut de sample.txt al servidor mitjançant objecte de sòcol s.

Envia dades= dossier.llegir(1024)

De nou llegint si queda alguna cosa. Per tant, no hi haurà res a llegir des del fitxer Envia dades estarà buit i sortirà del bucle while.

s.Tanca()

Això no tanca la connexió des del costat del client.

Captures de pantalla d'Ubuntu Al costat del servidor

Captures de pantalla d'Ubuntu Al costat del client

Combinacions provades:

  • Linux com a servidor i Linux com a client: PASS
  • Linux com a client i Linux com a servidor: PASS
  • Linux com a servidor i Windows10 com a client: PASS
  • Linux com a client i Windows10 com a servidor: PASS

La recomanació és utilitzar dos sistemes Linux per a servidor i client.

Errors esperats:

  1. Podeu veure l'error següent si el servidor no s'executa al port 9898

Traceback (última trucada més recent):

Dossier'Client.py',línia22, dins <mòdul>
s.connectar((ServerIp,PORT))
ConnectionRefusedError:[Errno111]Connexió rebutjada
  1. A continuació es mostra un error si l'adreça IP no es transmet al client

Córrer com

client python3.py <adreça serverip>
  1. A continuació es mostra l'error si 1cl'argument al costat del client no és una adreça IP

Traceback (última trucada més recent):

Dossier'Client.py',línia22, dins <mòdul>
s.connectar((ServerIp,PORT))
endoll.gaierror:[Errno -2]Nomo béserveinoconegut
  1. A continuació es visualitza l'error si s'utilitza el port com el 98980

Traceback (última trucada més recent):

Dossier'Client.py',línia22, dins <mòdul>
s.connectar((ServerIp,PORT))
OverflowError: getsockaddrarg: el port ha de ser0-65535.
  1. A continuació es mostra un error si sample.txt no està present al costat del client.

Traceback (última trucada més recent):

Dossier'Client.py',línia25, dins <mòdul>
dossier = obert('sample.txt', 'rb')
FileNotFoundError:[Errno2]Hi ha taldossier o bédirectori:'sample.txt'

Conclusió:

Mitjançant aquest programa podem enviar un simple fitxer de text d’un sistema a un altre sistema a través de la xarxa mitjançant el programa python. Això ens proporciona un aprenentatge bàsic de la programació de sockets i python també per enviar dades per xarxa.