Python套接字(套接字错误错误错误文件描述符)
下面的Python套接字(套接字错误错误错误文件描述符),python,sockets,Python,Sockets,下面的receiveFile()函数从套接字读取文件名和文件数据,并使用分隔符$将其拆分 但是我无法关闭套接字,并且引发了一个错误的文件描述符错误。如果我注释掉self.server\u socket.close()语句,则没有错误,但socket将永远侦听 代码:- def listen(self): self.server_socket.listen(10) while True: client_socket, address = self.server_so
receiveFile()
函数从套接字读取文件名和文件数据,并使用分隔符$
将其拆分
但是我无法关闭套接字,并且引发了一个错误的文件描述符
错误。如果我注释掉self.server\u socket.close()
语句,则没有错误,但socket将永远侦听
代码:-
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
回溯(最近一次呼叫最后一次):
文件“server.py”,第45行,在
a=服务器(1111)
文件“server.py”,第15行,在_init中__
self.listen()
文件“server.py”,第20行,在listen中
client\u socket,address=self.server\u socket.accept()
文件“c:\Python27\lib\socket.py”,第202行,在accept中
sock,addr=self.\u sock.accept()
文件“c:\Python27\lib\socket.py”,第170行,在\u-dummy中
引发错误(EBADF,“错误的文件描述符”)
socket.error:[Errno 9]错误的文件描述符
您正在关闭服务器的侦听套接字,然后再次对其调用accept()。
要完成接收一个文件,您应该关闭客户端连接的套接字(函数receiveFile中的sock)
在这段代码中,我试图在收到文件后关闭服务器
当您想关闭服务器时,您需要的是打破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'
错误可能不是源于该代码,但无论您在哪里调用
self.server\u socket.accept()
,都会有助于包含更多的代码和完整的回溯。因此,您希望服务器在收到文件后立即关闭,或者您只是想关闭活动连接?@aya在这段代码中,我试图在收到文件后关闭服务器。我理解您的意思,关闭套接字和服务器的正确顺序是什么?这取决于您需要何时关闭服务器。如果您只想接收一个文件,只需关闭客户端连接,然后再关闭监听套接字。感谢@aya,我通过从receiveFile函数返回值来打破循环,从而以不同的方式解决问题