从阅读asyncore
documentation开始,在成功连接到侦听套接字后,即在TCP握手完成后,应该调用handle_connect()
。但在实践中,似乎asyncore
不会运行handle_connect()
,除非它在套接字上接收或发送数据包。
举个例子:
我有服务器套接字绑定并侦听某个端口。套接字将接受任何传入连接,打印收到的内容,然后发送“谢谢”。
然后我启动一个基于asyncore.dispatcher
的客户端,在创建时连接到服务器套接字。客户端有一个方法handle_connect()
,它向服务器发送一个“hello”数据包。它还有一个方法读取打印收到的数据包。 (在这种情况下,它应该打印“谢谢”)
运行此客户端时,将创建连接,TCP握手成功,服务器可以接受连接,但不会发生任何其他情况。永远不会调用handle_connect()
。
使asyncore运行handle_connect()
的唯一方法是服务器首先发送数据包,或者如果我在__init()__
函数中向服务器发送数据包。然后handle_connect()
起作用,一切正常。
这是事情应该如何运作?如果是这样,为什么?或者这只是一个自asyncore
以来没有纠正的错误?
还有其他方法可以解决这个问题吗?
答案 0 :(得分:0)
不是sock.connect
的解决方法,但可用于捕获socket.error
例外:
def handle_error(self):
t, v, tb = sys.exc_info()
if t == socket.error:
print("Connect error")
答案 1 :(得分:0)
可能无法调用handle_connect,因为在派生类的 init 方法中,您可能已使用1调用setblocking()函数。将在 init 调用中建立连接并且永远不会调用handle_connect。
如果不是这种情况,则可读方法返回false并且handle_connect不会被调用。
答案 2 :(得分:0)
我刚刚遇到了与Python 3相同的问题。在部分/全部(现在不能记住确切的细节)系统,当建立连接时,发出“socket ready ready”事件的信号。因此,如果您的调度程序的writeable()
方法在连接套接字之前返回False
,则asyncore模块中的select()
/ poll()
函数将永远不会检查套接字是否变为“可写” ,永远不会检测到连接建立,永远不会调用handle_connect()
方法。
我按照以下方式修复了它:
def writable(self):
if not self.connected:
return True
# ... your logic goes here