我的类包含一个连接到服务器的套接字。类的某些方法可以引发异常。我正在运行的脚本包含一个外部循环,它捕获异常、记录错误并创建一个新的类实例,该实例尝试重新连接到服务器。在
问题是服务器一次只处理一个连接(按设计),而“旧”套接字仍然是连接的。因此,新的连接尝试会挂起脚本。我可以通过强制关闭旧的套接字来解决这个问题,但是我想知道:为什么套接字不能自动关闭?在
当它“卡住”时,netstat显示连接到端口的两个套接字。服务器正在等待来自第一个套接字的输入,但是它还没有处理新的套接字。在
我在一个虚拟服务器上运行此命令,该服务器对每条传入线路都答复“error\n”。在
编辑:请参阅我对Mark Rushakoff's answer below的评论。异常处理程序中的assert(False)[我随后捕捉到的]似乎强制关闭套接字。在import socket
class MyException(Exception):
pass
class MyClient(object):
def __init__(self, port):
self.sock = socket.create_connection(('localhost', port))
self.sockfile = self.sock.makefile()
def do_stuff(self):
self._send("do_stuff\n")
response = self._receive()
if response != "ok\n":
raise MyException()
return response
def _send(self, cmd):
self.sockfile.write(cmd)
self.sockfile.flush()
def _receive(self):
return self.sockfile.readline()
def connect():
c = MyClient(9989)
# On the second iteration, do_stuff() tries to send data and
# hangs indefinitely.
print c.do_stuff()
if __name__ == '__main__':
for _ in xrange(3):
try:
connect()
except MyException, e:
print 'Caught:', e
# This would be the workaround if I had access to the
# MyClient object:
#c.sock.close()
#c.sockfile.close()
编辑:以下是(丑陋的)服务器代码:
^{pr2}$