【发布时间】: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