如何检查Python中的连接是否仍然有效?

时间:2019-09-27 05:02:02

标签: python sockets connection

我一直在尝试切断多个客户端可以连接的服务器,但遇到了问题。我有一个列表,其中列出了所有当前连接的目标,我想检查它们是否仍然存在,而不必手动连接它们。

这是我编写的类中的侦听器方法:

def listenForConnections(self):
        self.s.bind((self.HOST, self.PORT)) 
        while True:
            self.s.listen(128)
            c, addr = self.s.accept()
            self.c = c
            print("\n[+]Got a new connection!")
            self.conns.append(c)

如您所见,它将一个新的连接对象添加到列表中,然后您可以从该列表中使用同一类的getTarget()方法选择一个目标,但由于您可能知道它的外观,因此我不会在此处粘贴它喜欢。请记住,侦听器在单独的线程中运行。现在,我想编写一种ping()函数,该函数每隔几秒钟检查一次,如果conns列表中的所有连接仍然都处于活动状态,但是我不知道该怎么做。我认为在ping方法中,我必须每隔几秒钟向客户端发送一些数据,但是我担心它会破坏整个程序,因为它可能是客户端认为这是用户发送的有效命令,而不是一些垃圾检查连接是否处于活动状态。

1 个答案:

答案 0 :(得分:0)

如果要使用PING消息来检测客户端是否仍在运行,则必须在客户端/服务器协议中提供此信息。正如您已经提到的,客户端必须能够看到它是PING消息,而不是“正常”消息。仅当您可以更改客户端/服务器协议时,这才有效。如果客户端/服务器协议严格基于请求/响应,则实现起来比较困难,因为现在服务器也可以启动消息。

还有其他选择:

  • 如果客户端正确关闭了连接,则服务器可以在下次尝试与客户端进行通信时确定此连接。
  • 如果客户端正常连续发送请求,则可以假定客户端已死,如果客户端有一段时间没有发送新请求,则可以关闭连接。
  • 您可以使用TCP/IP keepalive来检测死客户。