python 扭曲:每个 ID 强制一个连接

python twisted: enforcing a single connection per id

我有一个扭曲的服务器,它使用 SSL 套接字并使用证书来识别连接到服务器的不同客户端。我想强制每个可能的 ID 只有一个连接的状态。我能想到的两种方法是跟踪连接的 ID,然后不允许使用相同 ID 的第二个连接或允许第二个连接并立即终止第一个连接。我正在尝试稍后做,但遇到了一些问题(我会在最后解释我的选择)

我在工厂中存储了一个连接列表 class,然后在 SSL 握手之后,我将客户端的 ID 与该列表进行比较。如果它已经在该列表中,我会尝试对其调用 .transport.abortConnection()。然后我想做一些正常的事情来在我的数据库中记录新连接。但是,对 abortConnection() 的调用似乎并没有直接调用 connectionLost(),这是我进行清理并调用数据库以告知连接丢失的地方。因此,我的代码然后记录该 ID 已连接,但后来调用 connectionLost() 导致数据库似乎已断开该 ID。

是否有某种方法可以阻止传入的第二个连接进一步处理,直到第一个连接完成处理断开连接?

选择说明:我这样做的全部原因是我的 NAT 背后的客户端似乎会相当定期地更改其 IP 地址(每 1 -3天)。连接的设备只会不干净地切断它们的连接,然后它们会尝试与新 IP 重新连接。但是,我的服务器没有收到有关断开连接的通知,通常必须使连接超时。但是,在服务器超时连接之前,客户端有时会设法重新连接,然后服务器处于同一个客户端有两个明显连接的状态。所以,通常第一个连接是我真正想要终止的连接。

确定连接的 ID 后,您可以在 "new" 连接的传输上调用 self.transport.pauseProducing(),这将阻止任何通知,直到您调用 self.transport.resumeProducing()。然后,如果存在新连接,您可以从 oldConnection.connectionLost() 调用 newConnection.transport.resumeProducing()