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。
我目前是第一次使用 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。