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 :
- 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. Utiliser 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 tampon de 1024 octets a été utilisée.
Configuration requise :
- 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
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.pyIl ne devrait pas y avoir d'erreurs et vous devriez voir les impressions ci-dessous
Le serveur est listé sur le port : 9898Le 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.pyNous 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èsLe 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.
- serveur.py :
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 :
suDonner toute permission à .fichier py :
serveur chmod 777.pyExécuter le serveur.py :
./serveur.socket d'importation pyImportation 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 = 9898Maintenant, 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.
PauseCela doit sortir de la boucle while infinie au B_server.
- client.py :
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 = 9898Ce 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 :
- 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, danss.connect((ServerIp, PORT))
ConnectionRefusedError : [Errno 111] Connexion refusée
- L'erreur ci-dessous s'affiche si l'adresse IP n'est pas transmise côté client
Courir comme
client python3.py < serverip address >- 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, danss.connect((ServerIp, PORT))
prise.gaierror : [Errno -2] Nom ou service inconnu
- 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, danss.connect((ServerIp, PORT))
OverflowError : getsockaddrarg : le port doit être 0-65535.
- 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, dansfichier = 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.