在python中捕获断开的套接字
当发生断开的管道异常时,我在检测断开的套接字时遇到问题。有关示例,请参见以下代码: 服务器:在python中捕获断开的套接字,python,sockets,Python,Sockets,当发生断开的管道异常时,我在检测断开的套接字时遇到问题。有关示例,请参见以下代码: 服务器: import errno, select, socket, time, SocketServer class MetaServer(object): def __init__(self): self.server = Server(None, Handler, bind_and_activate=False) def run(self, sock, addr):
import errno, select, socket, time, SocketServer
class MetaServer(object):
def __init__(self):
self.server = Server(None, Handler, bind_and_activate=False)
def run(self, sock, addr):
rfile = sock.makefile('rb', 1)
self.server.process_request(sock, addr)
while 1:
r, _, _ = select.select([rfile], [], [], 1.0)
if r:
print 'Got %s' % rfile.readline()
else:
print 'nothing to read'
class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
allow_reuse_address = True
daemon_threads = True
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
print 'connected!'
try:
while 1:
self.wfile.write('testing...')
time.sleep(1)
except socket.error as e:
if e.errno == errno.EPIPE:
print 'Broken pipe!'
self.finish()
self.request.close()
if __name__ == '__main__':
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8081))
s.listen(5)
ms = MetaServer()
while 1:
client, address = s.accept()
ms.run(client, address)
客户:
import select, socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8081))
while 1:
r, _, _ = select.select([s], [], [], 1.0)
if not r:
continue
msg = s.recv(1024)
print 'Got %s' % (msg,)
现在,如果我运行服务器和客户机,一切正常,我每秒都会收到一条“nothing is read”(无需读取)消息。我一按CTRL-C键离开客户端,服务器就会发疯,开始“读取”一个应该被破坏的套接字,转储大量“get”消息
是否有某种方法可以检测到MetaServer.run()函数中的此断开的套接字以避免上述行为?是,这并不是文档中真正的内容,而是旧的Un*x行为:当您得到一个空字符串时,您需要中止。您可以通过
select
说数据已准备好,但read
/readline
返回一个空字符串来检测它,对吗?我想这就是正在发生的事情。