2016-08-12 153 views
3

我目前首次使用python的套接字庫,並且我對計算機網絡不是很熟練。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

爲了能夠存活存在於How to change tcp keepalive timer using python script?

重複的問題,記住一些服務器和中間代理強行關閉長期存活的連接,無論保持活動的使用與否,在這種情況下,你會看到無論發生什麼,X時間後都會有一個FIN,ACK。

+0

謝謝。保持活動正在發送,但服務器仍然關閉連接。也許有服務器期望的數據,並在沒有收到數據後關閉。 –

相關問題