Envoi de transfert de fichiers de socket Python

Python Socket File Transfer Send



Le but de cet article est d'apprendre comment transférer un fichier texte sur le réseau via un programme python . Ce transfert de fichiers est basé sur le modèle client serveur pour utiliser la programmation socket en python3+.

Voici le schéma de configuration de base pour exécuter ce programme.









Pour plus de simplicité, nous appellerons le système A comme A_client et le système B comme B_server tout au long de l'article.



Exigences de fichier :

Nous avons besoin serveur.py et ce fichier doit être présent sur le système serveur. Dans notre cas, server.py devrait être sur le système B_server.





Deux autres fichiers client.py et exemple.txt doit être présent sur le système client. Dans notre cas, ces deux fichiers doivent être présents sur le système A_client.

Hypothèses:

Voici les hypothèses :



  • Nous devrions avoir deux systèmes Linux avec accès au terminal.
  • La saveur Linux préférable est Ubuntu .
  • Python3 doit être installé.
  • Les deux systèmes Linux devraient pouvoir se pinger. Utilisation ping commande pour vérifier le ping.
  • Un système doit agir en tant que serveur et un autre système doit agir en tant que client à un moment donné.

Limites:

Avant d'aller plus loin, nous devons savoir qu'il existe certaines limitations de ce programme.

  • Python3+ doit être installé pour exécuter ce programme. Vous pouvez observer une erreur ou un comportement différent si vous l'exécutez sur d'anciennes versions de python.
  • Seul le fichier texte peut être transféré via ce programme à partir de maintenant. Tout autre fichier de format qui ne contient pas de texte peut échouer.
  • Les exceptions de programmation de base ont été gérées dans le programme.
  • Le programme peut ou non fonctionner sur un autre système d'exploitation qu'Ubuntu.
  • Le fichier texte doit être court côté client car une taille de mémoire tampon de 1024 octets a été utilisée.

Configuration des exigences :

  • Nous avons besoin d'au moins un système Linux pour essayer ce programme. Mais la recommandation est d'utiliser deux systèmes Linux différents qui sont connectés via le réseau.
  • Deux systèmes doivent être connectés via Ethernet ou Wi-Fi ou toute autre connexion.

Code source du serveur :

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

Client Source Code:

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

Comment exécuter des programmes et le résultat attendu :

Voici les étapes pour exécuter le programme.

Étape 1 : Accédez au système B_server et ouvrez un terminal. Le raccourci pour ouvrir un terminal est Alt+Ctrl+t.

Étape 2 : allez maintenant dans le chemin où server.py est présent.

Étape 3 : exécutez maintenant server.py comme ci-dessous

serveur python3.py

Il ne devrait pas y avoir d'erreurs et vous devriez voir les impressions ci-dessous

Le serveur est listé sur le port : 9898

Le nom du fichier copié sera recv.txt côté serveur

Étape 4: Ouvrez maintenant le terminal sur le système A_client.

Étape 5 : accédez au chemin où client.py et sample.txt sont présents.

Étape 6 : exécutez maintenant client.py comme ci-dessous

client python3.py <IP du système B_server>

Nous avons observé que nous avons besoin de connaître l'adresse IP du serveur. Nous pouvons exécuter la commande ci-dessous pour connaître l'adresse IP du système B_server.

ifconfig

Maintenant, la sortie du système A_client devrait ressembler à ceci

################## Le message ci-dessous est reçu du serveur ##################
| --------------------------------- |
Salut client[Adresse IP : 192.168.1.102],
**Bienvenue sur le serveur**
-Serveur
| --------------------------------- |

Step7: Allez maintenant sur B_server et recherchez la sortie ci-dessous

Le fichier a été copié avec succès
Le serveur a fermé la connection

Étape 8 : Il devrait y avoir un nom de fichier recv.txt dans le dossier du serveur. Le contenu de ce recv.txt doit être le même sample.txt.

Nous avons donc copié avec succès un fichier du client au serveur sur le réseau via le programme python.

Explications des codes :

Il y a deux fichiers python serveur.py et client.py .

Notez que nous expliquerons une fois si un code est identique dans server.py et client.py.

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

Il s'agit de la ligne shebang, ce qui signifie que par défaut, ce server.py doit utiliser python3. Voyons un avantage de cette ligne.

Nous avons exécuté le server.py ou le client.py comme python3. Maintenant, sans utiliser python3, nous pouvons exécuter le fichier python. Suivez les commandes ci-dessous

Passez en mode super utilisateur :

son

Donnez toutes les autorisations au fichier .py :

chmod777serveur.py

Exécutez server.py :

./serveur.py importer prise
Importationprisebibliothèque dans le programme pythoncommenous allons
utiliserprise pourlien.

s = prise.prise()

Nous créons un objet s pour accéder à toutes les méthodes de socket. Il s'agit d'un concept de POO.

PORT= 9898

Maintenant, nous choisissons un port où le serveur sera à l'écoute. Nous pouvons utiliser un port non réservé à la place.

s.lier(('',PORT))

Nous utilisons la méthode bind pour lier l'adresse IP du serveur à ce port [9898]. Une observation est que nous aurions pu utiliser l'adresse IP exacte du serveur à la place du premier argument de la méthode de liaison, mais nous avons choisi de laisser ce champ vide car cela fonctionne bien.

s.lier((adresse IP,PORT))
déposer = ouvert('recv.txt', 'wb')

Nous avons ouvert un nom de fichier recv.txt sur le serveur pour le mode écriture et obtenu un pointeur de fichier. Ceci est nécessaire car nous devons copier un fichier texte à partir du client.

tandis que Vrai:

Commençons une boucle while infinie car le travail du serveur consiste à attendre qu'un client communique avec le serveur sur ce port 9898. Cette boucle while est donc requise.

Connecticut,adresse=s.J'accepte()

Ce code est d'accepter toute demande de connexion entrante du client. Conn utilisera Connecticut communiquer avec le client et adresse est l'adresse IP du client qui a envoyé une demande d'agitation à ce serveur sur le port 9898.

message= ' | --------------------------------- | Bonjour Client[Adresse IP :
'
+ adresse[0]+'], **Bienvenue sur le serveur** -Serveur
| --------------------------------- | '

Ce code sert à créer un message à envoyer au client. Ce message doit être imprimé sur le terminal client. Cela confirme que le client est capable de communiquer avec le serveur.

Connecticut.envoyer(msg.encoder())

Maintenant, nous avons le message prêt, puis l'envoyons au client en utilisant ce Connecticut. Ce code envoie en fait un message au client.

RecvData=Connecticut.recv(1024)

Ce code reçoit toutes les données envoyées du côté client. Dans notre cas, nous attendons le contenu de sample.txt dans RecvData .

tandis queRecvData :

Une autre boucle while avec la condition RecvData n'est pas vide. Dans notre cas, il n'est pas vide.

déposer.écrivez(RecvData)

Une fois que nous avons du contenu à l'intérieur RecvData alors nous écrivons dans ce fichier recv.txt utiliser le pointeur de fichier déposer.

RecvData=Connecticut.recv(1024)

Essayez à nouveau de recevoir s'il y a des données du client. Une fois que RecvData n'a pas de données, le code interrompra la boucle while.

déposer.proche()

Cela fermera simplement le pointeur de fichier lorsque nous en aurons terminé avec l'écriture de fichier.

Connecticut.proche()

Cela fermera la connexion avec le client.

Pause

Cela doit sortir de la boucle while infinie au B_server.

  1. client.py :
importer système

L'importation de la bibliothèque sys comme nous le souhaitons utilise la fonction d'argument en python.

si (longueur(système.argv) > 1):
ServerIp= système.argv[1]
autre:
imprimer(' Courir comme python3 client.py ')
sortir(1)

Comme nous passons l'adresse IP de B_server après le nom de fichier client.py lors de l'exécution, nous devons capturer cette adresse IP de serveur à l'intérieur du client.

…..if (len(sys.argv) > 1) : => Pour s'assurer que l'utilisateur passe au moins un argument en tant qu'adresse IP et intercepte cette adresse IP insdie IP du serveur.

Si l'utilisateur ne passe pas au moins un argument, le code affiche l'aide et sort du code.

PORT= 9898

Ce doit être le même port que celui mentionné du côté B_server.

s.relier((ServerIp,PORT))

Ce code établira une connexion TCP à l'adresse IP du serveur avec ce port. Tout ce qui ne va pas à ce point entraîne des échecs de connexion.

déposer = ouvert('exemple.txt', 'rb')

Nous ouvrons sample.txt en mode lecture pour lire uniquement le contenu.

Envoyer des données= déposer.lire(1024)

Lecture du contenu du fichier et mise à l'intérieur Envoyer des données variable.

tandis queEnvoyer des données:

Nous commençons une boucle while si Envoyer des données a des données. Dans notre cas, si sample.txt n'est pas vide, il doit contenir des données.

s.envoyer(Envoyer des données)

Maintenant, nous pouvons envoyer le contenu de exemple.txt au serveur en utilisant l'objet socket s.

Envoyer des données= déposer.lire(1024)

Lisez à nouveau s'il reste quelque chose. Il n'y aura donc rien à lire dans le fichier Envoyer des données sera vide et il sortira de la boucle while.

s.proche()

Il ne s'agit pas de fermer la connexion côté client.

Captures d'écran Ubuntu côté serveur

Captures d'écran Ubuntu Côté client

Combinaisons testées :

  • Linux comme serveur et Linux comme client : PASS
  • Linux comme client et Linux comme serveur : PASS
  • Linux comme serveur et Windows10 comme client : PASS
  • Linux comme client et Windows10 comme serveur : PASS

La recommandation est d'utiliser deux systèmes Linux pour le serveur et le client.

Erreurs attendues :

  1. Vous pouvez voir l'erreur ci-dessous si le serveur ne fonctionne pas sur le port 9898

Traceback (appel le plus récent en dernier) :

Déposer'client.py',ligne22, dans <module>
s.relier((ServerIp,PORT))
Erreur de connexion refusée :[Errno111]Connexion rejetée
  1. L'erreur ci-dessous s'affiche si l'adresse IP n'est pas transmise côté client

Courir comme

client python3.py <Adresse IP du serveur>
  1. L'erreur ci-dessous est vue si 1stl'argument côté client n'est pas une adresse IP

Traceback (appel le plus récent en dernier) :

Déposer'client.py',ligne22, dans <module>
s.relier((ServerIp,PORT))
prise.gaierreur:[Errno -2]Nomouservicene pasconnu
  1. L'erreur ci-dessous est vue si le port est utilisé comme 98980

Traceback (appel le plus récent en dernier) :

Déposer'client.py',ligne22, dans <module>
s.relier((ServerIp,PORT))
Erreur de débordement: getsockaddrarg : le port doit être0-65535.
  1. L'erreur ci-dessous s'affiche si sample.txt n'est pas présent côté client.

Traceback (appel le plus récent en dernier) :

Déposer'client.py',ligne25, dans <module>
déposer = ouvert('exemple.txt', 'rb')
FileNotFoundError :[Errno2]Aucunedéposer ouannuaire:'exemple.txt'

Conclusion:

En utilisant ce programme, nous pouvons envoyer un simple fichier texte d'un système à un autre système via le réseau en utilisant le programme python. Cela nous donne un apprentissage de base de la programmation python et socket également pour l'envoi de données sur le réseau.