我第一次使用Python的socket库,并且对计算机网络方面不是很有经验。我能够连接到服务器,通过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()