Python套接字 - 从客户端

时间:2016-08-12 15:12:03

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

我目前第一次使用python的套接字库,而且我对计算机网络的熟练程度不高。

我能够连接到服务器并且由wireshark查看tcp握手已经发生。建立与服务器的连接后(我无法控制服务器),连接保持打开一段时间,但在很短的时间后,服务器发送“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()

1 个答案:

答案 0 :(得分:1)

为了保持活着,How to change tcp keepalive timer using python script?

有一个重复的问题

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