我使用Twisted编写代理服务器,但我在检查与服务器的连接是否已关闭时遇到问题。
就像现在一样,我有
客户< - >代理< - >服务器
使用telnet进行测试,代理成功地将消息从客户端传递到服务器,并将服务器响应传递回客户端。但是,我的问题是如果客户端发出命令来关闭代理和服务器之间的连接,客户端和代理之间的连接仍然存在。
以下是我的一些代码
client_factory = protocol.ClientFactory()
client_factory.protocol = ClientTelnetProtocol
client_factory.proxy = self
try:
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 1234))
clientsocket.close()
reactor.connectTCP('localhost', 1234, client_factory)
except Exception as err:
print(err)
self.transport.loseConnection()
在第
行reactor.connectTCP('localhost', 1234, client_factory)
我希望能够监视连接的状态并查看服务器是否关闭它,可能是在dataReceived()上,或者如果可能的话,在服务器关闭与代理的连接时设置了一个中断,并且代理立即关闭与客户端的连接。
答案 0 :(得分:1)
ITransport
会通过致电IProtocol
提供商的connectionLost
通知其IProtocol
连接丢失事件。因此,如果您想对该事件做出反应,您应该在协议上实现connectionLost
(在这种情况下为ClientTelnetProtocol
,它会出现吗?)并将您的应用程序逻辑放在该方法中。一旦ITransport
实现知道连接已经丢失,就会调用此方法,因此它应该满足您的需求(请注意,它不是中断,因为Twisted是一个(很大程度上)单个 - 线程协作多任务系统;因此,如果您有阻止的应用程序代码(例如,clientsocket.connect
)Twisted将不会调用任何的回调,直到完成并且反应器重新获得控制权。但只要有机会,它就会向处理程序(例如connectionLost
)发送事件(例如连接丢失)。
我不明白为什么您的示例代码直接使用socket
模块创建然后丢弃与目标地址的连接。我的猜测是你试图确定服务器是否接受连接。在这种情况下,您可能希望使用the ClientFactory
method clientConnectionFailed
来检测reactor.connectTCP
尝试的连接是否失败,而不是使用socket
模块并检查异常。您也可以使用Twisted's endpoint abstraction将此通知作为Deferred
回调来代替。
您可能也对Tubes感兴趣,它提供了更高级别的数据流抽象。