Python 套接字 - 保持客户端与服务器的连接

Python Sockets - Keeping a connection to a server alive from the client

我目前是第一次使用 python 的套接字库,我对计算机网络不是很有经验。

我能够连接到服务器,并且如 wireshark 所见,tcp 握手已经发生。建立与服务器的连接后(我无法控制服务器),连接会保持打开状态一段时间,但在一小段时间后,服务器发送 "FIN, ACK" 并终止连接。我正在尝试了解如何在客户端能够访问服务器时保持此连接有效。

看一个tcp连接,似乎每隔一段时间就可以发送一个数据包。也许是一种保持活力的信息。我原以为在另一个线程中每 5 秒使用 socket.send('hello') 会保持与服务器的连接打开,但一段时间后我仍然得到 "FIN, ACK"。

在文档中我发现了一个 setsockopt() 但使用它没有明显的区别。我在建立连接之前和之后都尝试过 client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)。我不完全理解这种方法应该如何工作,所以可能我使用不当。这个就不多说了。我在某处读到它在 windows 上被破坏了。我不知道那是真的。

我错过了什么?除非我可能遗漏了什么,否则套接字的文档似乎没有任何相关内容。

import socket
import time
import threading

SERVER_IP = 'THE SERVER'
SERVER_PORT = SERVER_PORT

SOURCE_IP = socket.gethostname()
SOURCE_PORT = 57004

KEEP_ALIVE_INTERVAL = 5

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

def keep_alive(interval):
    data = 'hello'
    while True:
        client.send(data)
        time.sleep(interval)

client.connect((SERVER_IP, SERVER_PORT))

t = threading.Thread(target=keep_alive, args = (KEEP_ALIVE_INTERVAL,))
t.start()

while True:
    data = client.recv(1024)
    if not data:
        break
    print data
client.close()

关于启用 keep alive 在 How to change tcp keepalive timer using python script?

有一个重复的问题

请记住,一些服务器和中间代理会强制关闭长期连接,无论是否使用 keep alives,在这种情况下,无论如何你都会在 X 时间后看到 FIN,ACK。