La fonction receiveFile()
suivante lit un nom de fichier et des données de fichier à partir du socket et les divise à l'aide du délimiteur $
.
Mais je ne parviens pas à fermer le socket et une erreur Bad file descriptor
Est générée. Si je commente l'instruction self.server_socket.close()
alors il n'y a pas d'erreur mais le socket écoute pour toujours.
Code:-
def listen(self):
self.server_socket.listen(10)
while True:
client_socket, address = self.server_socket.accept()
print 'connected to', address
self.receiveFile(client_socket)
def receiveFile(self,sock):
data = sock.recv(1024)
data = data.split("$");
print 'filename', data[0]
f = open(data[0], "wb")
#data = sock.recv(1024)
print 'the data is', data[1]
f.write(data[1])
data = sock.recv(1024)
while (data):
f.write(data)
data=sock.recv(1024)
f.close()
self.server_socket.close()
print 'the data is', data
print "File Downloaded"
Traceback: -
Traceback (most recent call last):
File "server.py", line 45, in <module>
a = Server(1111)
File "server.py", line 15, in __init__
self.listen()
File "server.py", line 20, in listen
client_socket, address = self.server_socket.accept()
File "c:\Python27\lib\socket.py", line 202, in accept
sock, addr = self._sock.accept()
File "c:\Python27\lib\socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor
Vous fermez le socket d'écoute du serveur et après cela, appelez à nouveau accept (). Pour terminer la réception d'un fichier, vous devez fermer le socket de connexion client (enfoncez dans la fonction receiveFile).
dans ce code, j'essaie d'arrêter le serveur une fois le fichier reçu
Vous aurez besoin de quelque chose pour sortir du while True
boucle lorsque vous souhaitez arrêter le serveur. Une solution simple serait d'exploiter l'exception générée lors de la fermeture du socket serveur ...
def listen(self):
self.server_socket.listen(10)
while True:
try:
client_socket, address = self.server_socket.accept()
except socket.error:
break
print 'connected to', address
self.receiveFile(client_socket)
print 'shutting down'