J'essaie de créer un programme en Python qui implémente des sockets, chaque client envoie un fichier PDF, le serveur le reçoit et le titre devient "fichier_numéro.pdf" (c'est-à-dire: fichier_1.pdf). Le problème présenté est que seul un client peut envoyer un fichier avec succès. Lorsqu'un deuxième client tente d'envoyer le programme, le programme plante. Qu'est-ce que je fais mal et comment puis-je résoudre mon code pour permettre à N clients (avec N <20) de se connecter au serveur et de transférer des fichiers?
Voici le code du serveur:
import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Acepta hasta 10 conexiones entrantes.
sc, address = s.accept()
print address
i=1
f = open('file_'+ str(i)+".pdf",'wb') # Open in binary
i=i+1
while (True):
# Recibimos y escribimos en el fichero
l = sc.recv(1024)
while (l):
f.write(l)
l = sc.recv(1024)
f.close()
sc.close()
s.close()
Voici le code client:
import socket
import sys
s = socket.socket()
s.connect(("localhost",9999))
f = open ("libroR.pdf", "rb")
l = f.read(1024)
while (l):
s.send(l)
l = f.read(1024)
s.close()
Pour simplifier mon code, j'utilise toujours un livre avec le nom de fichier "libroR.pdf", mais dans le code complet, il est choisi par une interface utilisateur graphique.
Vous devez mettre tout le code de sc, address = s.accept()
jusqu'à sc.close()
dans une autre boucle, sinon le serveur se termine simplement après la réception du premier fichier. Il ne plante pas, le script est juste terminé.
[EDIT] Voici le code révisé:
import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Accepts up to 10 connections.
while True:
sc, address = s.accept()
print address
i=1
f = open('file_'+ str(i)+".pdf",'wb') #open in binary
i=i+1
while (True):
# receive data and write it to file
l = sc.recv(1024)
while (l):
f.write(l)
l = sc.recv(1024)
f.close()
sc.close()
s.close()
Notez que s.listen(10)
signifie " définissez le débit maximum d'acceptation sur 10 connexions ", pas "arrêt après 10 connexions".
Votre code est bloqué dans la seconde boucle while.
Voir:
import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10)
i=1
while True:
sc, address = s.accept()
print address
f = open('file_'+str(i)+".pdf",'wb') #open in binary
i=i+1
print(i)
l = 1
while(l):
l = sc.recv(1024)
while (l):
f.write(l)
l = sc.recv(1024)
f.close()
sc.close()
s.close()
Vous fermez le socket du serveur (s
dans votre code) après avoir traité la première connexion client. Ainsi, un seul client est géré par votre serveur. Faites une boucle autour de accept
et lisez à partir de sc
.
En utilisant ce code, vous pouvez envoyer des fichiers plusieurs fois en utilisant le même client.py
Server.py
import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Acepta hasta 10 conexiones entrantes.
i = 1
while True:
sc, address = s.accept()
print address
f = open('file_'+ str(i)+".wav",'wb') #open in binary
i=i+1
while (True):
# recibimos y escribimos en el fichero
l = sc.recv(1024)
f.write(l)
if not l:
break
f.close()
sc.close()
print('copied the file.')
s.close()