次のreceiveFile()
関数は、ソケットからファイル名とファイルデータを読み取り、区切り文字_$
_を使用して分割します。
しかし、ソケットを閉じることができず、_Bad file descriptor
_エラーが発生します。 self.server_socket.close()
ステートメントをコメント化すると、エラーは発生しませんが、ソケットは永久に待機します。
コード:-
_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 (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
_
サーバーのリスニングソケットを閉じ、その後、再びソケットに対してaccept()を呼び出します。 1つのファイルの受信を完了するには、クライアント接続ソケットを閉じます(sock in function receive File)。
このコードでは、ファイルを受信したらサーバーをシャットダウンしようとしています
必要なのは、サーバーをシャットダウンするときにwhile True
ループから抜け出すためのものです。簡単な解決策は、サーバーソケットを閉じるときに生成される例外を悪用することです...
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'