【问题标题】:Python Sockets - Keeping a connection to a server alive from the clientPython 套接字 - 从客户端保持与服务器的连接处于活动状态
【发布时间】:2016-12-19 15:50:25
【问题描述】:

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

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

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

在文档中我找到了setsockopt(),但使用它并没有明显的区别。在建立连接之前和之后,我都尝试过client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)。我不完全理解这种方法应该如何工作,所以也许我用错了。这一点就不多说了。我在某处读到它在窗户上被打破了。我不知道其中的真相。

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

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()

【问题讨论】:

    标签: python sockets tcp network-programming tcp-ip


    【解决方案1】:

    为了启用保持活动,How to change tcp keepalive timer using python script? 有一个重复的问题

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

    【讨论】:

    • 谢谢。正在发送保持活动,但服务器仍然关闭连接。可能有服务器期待的数据,没有收到就关闭了。
    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2020-11-30
    • 2014-06-01
    • 1970-01-01
    • 2012-07-08
    • 2018-04-13
    相关资源
    最近更新 更多