Transfert de fichiers Python Socket Send

Transfert de fichiers Python Socket Send
L'intention de cet article est d'apprendre Comment transférer un fichier texte sur le réseau via le programme Python. Ce transfert de fichiers est basé sur le modèle client de serveur pour utiliser la programmation de socket dans Python3+.

Diagramme de configuration de base:

Voici le diagramme 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 au système serveur. Dans notre serveur de cas.Py devrait être au système B_Server.

Deux autres fichiers client.py et goûter.SMS devrait être présent au système client. Dans notre cas, ces deux fichiers devraient être présents au système A_Client.

Hypothèses:

Voici les hypothèses:

  • Nous devrions avoir deux systèmes Linux avec un accès terminal.
  • La saveur Linux préférable est Ubuntu.
  • Python3 doit être installé.
  • Les deux systèmes Linux devraient être capables de cingler. Utiliser ping-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 de poursuivre, nous devons savoir qu'il y a certaines limites de ce programme.

  • Python3 + doit être installé pour exécuter ce programme. Vous pouvez observer une erreur ou un comportement différent si vous exécutez sur des versions plus anciennes 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.
  • Des exceptions de programmation de base ont été gérées dans le programme.
  • Le programme peut ou non fonctionner sur d'autres systèmes d'exploitation que Ubuntu.
  • Le fichier texte doit être court côté client car une taille de 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 / webleample / blob / maître / python_send_file / serveur.py

Code source du client:

https: // github.com / linuxhintcode / websamples / blob / maître / python_send_file / client.py

#!/ usr / bin / env python3
# Importation de bibliothèques
socket d'importation
importer sys
# Permet de prendre le 1er argument en tant que IP de serveur
if (Len (sys.argv)> 1):
Serverip = sys.Argv [1]
autre:
print ("\ n \ n exécuter comme \ n python3 client.py \ n \ n ")
sortie (1)
# Maintenant, nous pouvons créer un objet à douille
s = socket.prise()
# Permet de choisir un port et de se connecter à ce port
Port = 9898
# Permet de se connecter à ce port où le serveur peut s'exécuter
s.connecter ((serverip, port))
# Nous pouvons envoyer un exemple de fichier.SMS
fichier = ouvert ("Exemple.txt "," rb ")
SendData = fichier.lire (1024)
tandis que SendData:
# Maintenant, nous pouvons recevoir des données du serveur
print ("\ n \ n ################## # # ################# # # ################# \ n \ n ", s.Recv (1024).Decode ("UTF-8"))
#Now envoie le contenu de l'échantillon.txt vers le serveur
s.envoyer (sendData)
SendData = fichier.lire (1024)
# Fermez la connexion du côté client
s.fermer()

Comment exécuter des programmes et une production attendue:

Voici les étapes pour exécuter le programme.

Étape 1: Accédez au système B_Server et ouvrez un terminal. La raccourci pour ouvrir un terminal est Alt + ctrl + t.

Étape2: allez maintenant le chemin où le serveur.py est présent.

Étape 3: Maintenant, exécutez le serveur.py comme ci-dessous

serveur Python3.py

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

Le serveur inscrit sur le port: 9898

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

ÉTAPE 4: Maintenant, terminal ouvert sur A_Client System.

Étape 5: allez sur le chemin où le client.py et échantillon.txt sont présents.

Étape 6: Maintenant, exécutez le client.py comme ci-dessous

Client Python3.py

Nous avons observé que nous devons 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 être comme ceci

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

Étape7: 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

Étape8: Il devrait y avoir un nom de fichier Recv.TXT au dossier du serveur. Le contenu de ce recv.TXT devrait être le même échantillon.SMS.

Nous avons donc réussi à copier un fichier du client au serveur sur le réseau via le programme Python.

Explications de code:

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

Notez que nous expliquerons une fois si un code est le même serveur.py et client.py.

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

Ceci est une 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.py comme python3 . Maintenant, sans utiliser python3, nous pouvons exécuter le fichier python. Suivez les commandes ci-dessous

Passez en mode User Super:

su

Donner toute la permission de .fichier py:

serveur Chmod 777.py

Exécuter le serveur.py:

./serveur.py
socket d'importation
# Importation de socket bibliothèque dans le programme Python car nous allons utiliser le socket pour la connexion.
s = socket.prise()

Nous créons un objet «S» Pour accéder à toutes les méthodes de socket. C'est un concept OOPS.

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 choisissons de laisser vide car cela fonctionne bien.

s.lier ((adresse IP, port))
fichier = ouvert ("recv.txt "," wb ")

Nous avons ouvert un nom de fichier «Recv.txt ”en mode serveur pour l'écriture et obtenu le pointeur de fichier. Ceci est nécessaire car nous devons copier un fichier texte à partir du client.

Bien que vrai:

Commençons un Infinite pendant que le travail du serveur est d'attendre qu'un client communique avec le serveur sur ce port 9898. Donc, cette boucle est nécessaire.

Conn, addr = s.accepter()

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

msg = "\ n \ n | --------------------------------- | \ n HI Client [adresse IP:
"+ addr [0] +"], \ n ** Bienvenue sur serveur ** \ n -server \ n
| --------------------------------- | \ n \ n \ n "

Ce code est de 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'envoyez au client en utilisant cela "Connecticut". Ce code envoie réellement 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 nous attendons au contenu de l'échantillon.txt dans «Recvdata».

Pendant que Recvdata:

Un de plus pendant que la boucle avec la condition de 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 «Recvdata» Ensuite, nous écrivons dans ce fichier «Recv.SMS" Utilisation du pointeur de fichier "déposer".

Recvdata = conn.Recv (1024)

Essayer à nouveau de recevoir s'il y a des données du client. Une fois «Recvdata» n'a pas de données, le code va casser la boucle while.

déposer.fermer()

Cela fera simplement fermer le pointeur de fichier car nous avons fini avec le fichier write.

Connecticut.fermer()

Cela fermera la connexion avec le client.

casser

Ceci va sortir d'Infinite en boucle sur b_server.

  1. client.py:
importer sys

Importation de bibliothèque sys comme nous voulons utiliser l'installation d'argument dans Python.

if (Len (sys.argv)> 1):
Serverip = sys.Argv [1]
autre:
print ("\ n \ n exécuter comme \ n python3 client.py \ n \ n ")
sortie (1)

Au fur et à mesure que nous passons l'adresse IP de B_Server après nom de fichier Client.PY Pendant l'exécution, nous devons attraper l'adresse IP de ce serveur à l'intérieur du client.

… If (Len (sys.argv)> 1): => pour s'assurer que l'utilisateur passe au moins un argument comme adresse IP et captez cette adresse IP INSDIE «Servertip».

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

Port = 9898

Cela doit être le même port que celle mentionnée du côté b_server.

s.connecter ((serverip, port))

Ce code fera la connexion TCP à Server IP avec ce port. Tout ce qui ne va pas sur ce ponint entraîne des échecs en relation.

fichier = ouvert ("Exemple.txt "," rb ")

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

SendData = fichier.lire (1024)

Lire le contenu du fichier et mettre à l'intérieur "Envoyer des données" variable.

tandis que SendData:

Nous en commençons un pendant la boucle si «Envoyer des données" a des données. Dans notre cas, si «échantillonne.txt ”n'est pas vide, il devrait avoir des données.

s.envoyer (sendData)

Maintenant, nous pouvons envoyer du contenu de "goûter.SMS" au serveur à l'aide d'objet Socket «S».

SendData = fichier.lire (1024)

Encore une fois lire 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.

s.fermer()

Ce n'est pas à la fermeture de la connexion du côté client.

Captures d'écran Ubuntu côté serveur

Captures d'écran Ubuntu côté client

Combinaisons testées:

  • Linux en tant que serveur et linux en tant que client: passer
  • Linux en tant que client et linux en tant que serveur: passer
  • Linux en tant que serveur et Windows10 en tant que client: passer
  • Linux en tant que client et Windows10 en tant que serveur: passer

La recommandation consiste à utiliser deux systèmes Linux pour le serveur et le client.

Erreurs attendues:

  1. Vous pouvez voir ci-dessous l'erreur si le serveur n'est pas en cours d'exécution sur le port 9898

Traceback (dernier appel dernier):

Fichier "Client.py ", ligne 22, dans
s.connecter ((serverip, port))
ConnectionRefusedError: [Errno 111] Connexion refusée
  1. L'erreur ci-dessous est vue si l'adresse IP n'est pas transmise à côté du client

Courir comme

Client Python3.py < serverip address >
  1. Une erreur ci-dessous est vue si 1St L'argument du côté client n'est pas une adresse IP

Traceback (dernier appel dernier):

Fichier "Client.py ", ligne 22, dans
s.connecter ((serverip, port))
prise.Gaierror: [Errno -2] Nom ou service non connu
  1. L'erreur ci-dessous est vue si le port est utilisé comme 98980

Traceback (dernier appel dernier):

Fichier "Client.py ", ligne 22, dans
s.connecter ((serverip, port))
Overflowerror: getockaddrarg: le port doit être 0-65535.
  1. Une erreur ci-dessous est observée si «l'échantillon.txt »n'est pas présent du côté client.

Traceback (dernier appel dernier):

Fichier "Client.py ", ligne 25, en
fichier = ouvert ("Exemple.txt "," rb ")
Filenotfounderror: [errno 2] pas de tel fichier ou répertoire: «Exemple.SMS'

Conclusion:

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