Python

Envoi de transfert de fichiers de socket Python

Envoi de transfert de fichiers de socket Python
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+.

Schéma de configuration de base :

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 serveur.py devrait être sur le système B_server.

Deux autres fichiers client.py et goûter.SMS 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 :

Limites:

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

Configuration requise :

Code source du serveur :

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

Code source client :

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ù le serveur.py est présent.

Étape 3 : exécutez maintenant le serveur.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ù le client.py et échantillon.txt sont présents.

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

client python3.py

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: Maintenant, allez sur B_server et recherchez la sortie ci-dessous

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

Step8: Il devrait y avoir un nom de fichier recv.txt dans le dossier du serveur. Le contenu de cette recv.txt devrait être le même exemple.SMS.

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 le même à l'intérieur du serveur.py et client.py.

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

Ceci est la ligne shebang qui signifie par défaut ce serveur.py devrait utiliser python3. Voyons un avantage de cette ligne.

Nous avons exécuté le serveur.py ou client.j'aime python3 <.py file name>. Maintenant, sans utiliser python3, nous pouvons exécuter le fichier python. Suivez les commandes ci-dessous

Passez en mode super utilisateur :

su

Donner toute permission à .fichier py :

serveur chmod 777.py

Exécuter le serveur.py :

./serveur.socket d'importation py
Importation de la bibliothèque de sockets dans le programme python au fur et à mesure
utiliser la prise pour la connexion.
s = prise.prise()

Nous créons un objet "s" pour accéder à toutes les méthodes de socket. C'est un concept de POO.

PORT = 9898

Maintenant, nous choisissons un port où le serveur écoutera. Nous pouvons utiliser un port non réservé au lieu de cela.

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 le champ vide car cela fonctionne bien.

s.lier ((adresse IP, PORT))
fichier = open("recv.txt", "wb")

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

tant 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. Donc cette boucle while est requise.

conn, 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 de commotion à ce serveur sur le port 9898.

msg = "\n\n|---------------------------------|\n Salut Client[Adresse IP :
"+ addr[0] + "], \n **Bienvenue sur le serveur** \n -Serveur\n
|---------------------------------|\n \n\n"

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 = conn.recv(1024)

Ce code reçoit toutes les données envoyées du côté client. Dans notre cas, nous attendons le contenu de l'échantillon.txt dans "Données Recv".

tandis que RecvData :

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

déposer.écrire (RecvData)

Une fois que nous avons du contenu à l'intérieur "Données Recv" alors nous écrivons dans ce fichier « recv.SMS" utiliser le pointeur de fichier "déposer".

RecvData = conn.recv(1024)

Essayer à nouveau de recevoir s'il y a des données du client. Une fois que "Données Recv" n'a pas de données le code va casser la boucle while.

déposer.Fermer()

Cela fermera simplement le pointeur de fichier car nous avons terminé avec l'écriture de fichier.

Connecticut.Fermer()

Cela fermera la connexion avec le client.

Pause

Cela doit sortir de la boucle while infinie au B_server.

  1. client.py :
importer le système

Importation de la bibliothèque sys comme nous le souhaitons, utilisez la fonction d'argument en python.

si (len(sys.argv) > 1) :
ServerIp = sys.argv[1]
autre:
print("\n\n Exécuter comme \n client python3.py < serverip address > \n\n")
sortie(1)

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

… si (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.connect((ServeurIp, PORT))

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

fichier = open("exemple.txt", "rb")

Nous ouvrons « échantillon.txt" en mode lecture pour lire uniquement le contenu.

SendData = fichier.lire (1024)

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

tandis que SendData :

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

s.envoyer (EnvoyerDonnées)

Maintenant, nous pouvons envoyer le contenu de "goûter.SMS" au serveur en utilisant l'objet socket "s".

SendData = fichier.lire (1024)

A lire à 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.Fermer()

Ce n'est pas fermer la connexion du 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) :

Fichier "client.py", ligne 22, dans
s.connect((ServerIp, PORT))
ConnectionRefusedError : [Errno 111] Connexion refusée
  1. L'erreur ci-dessous s'affiche si l'adresse IP n'est pas transmise côté client

Courir comme

client python3.py < serverip address >
  1. L'erreur ci-dessous est vue si 1st l'argument côté client n'est pas une adresse IP

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

Fichier "client.py", ligne 22, dans
s.connect((ServerIp, PORT))
prise.gaierror : [Errno -2] Nom ou service inconnu
  1. L'erreur ci-dessous est vue si le port est utilisé comme 98980

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

Fichier "client.py", ligne 22, dans
s.connect((ServerIp, PORT))
OverflowError : getsockaddrarg : le port doit être 0-65535.
  1. L'erreur ci-dessous est visible si « échantillon.txt" n'est pas présent côté client.

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

Fichier "client.py", ligne 25, dans
fichier = open("exemple.txt", "rb")
FileNotFoundError : [Errno 2] Aucun fichier ou répertoire de ce type : 'sample.SMS'

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.

Top 10 des jeux à jouer sur Ubuntu
La plate-forme Windows a été l'une des plates-formes dominantes pour les jeux en raison du pourcentage énorme de jeux qui se développent aujourd'hui p...
5 meilleurs jeux d'arcade pour Linux
De nos jours, les ordinateurs sont des machines sérieuses utilisées pour les jeux. Si vous ne pouvez pas obtenir le nouveau score élevé, vous saurez c...
Bataille pour Wesnoth 1.13.6 Développement publié
Bataille pour Wesnoth 1.13.6 publiée le mois dernier, est la sixième version de développement de la 1.13.x series et il apporte un certain nombre d'am...