为什么Python 3 TCP客户端无法关闭连接?

时间:2019-05-23 13:16:51

标签: python sockets connection

我想以正确的方式以简单的客户端服务器聊天方式关闭客户端连接,而不会超时关闭客户端连接。不幸的是,客户端站点上的连接没有关闭。

服务器代码

import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 65432)
sock.bind(server_address)
sock.listen(1)

while True:
    connection, client_address = sock.accept()
    try:
        while True:
            data = connection.recv(1024)
            print(data)
            if data:
                connection.sendall(data)
            else:
                break

    finally:
        connection.close()

客户代码

import socket
import time

HOST = '127.0.0.1'
PORT = 65432

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello world')

data = s.recv(1024)
print('Received', data)
time.sleep(5)
#s.sendall('Hello world, again'.encode())
s.close()

启动服务器会导致:

tcp    LISTEN   0    1    127.0.0.1:65432    0.0.0.0:* 

运行客户端后,我希望状态相同,但是客户端连接已打开。

tcp   LISTEN    0    1   127.0.0.1:65432    0.0.0.0:*                  
tcp   TIME-WAIT   0    0    127.0.0.1:57794    127.0.0.1:65432

但是如果我取消注释以下行:

#s.sendall('Hello world, again'.encode())

结果符合我的预期。

tcp    LISTEN   0    1    127.0.0.1:65432    0.0.0.0:* 

为什么第二次发送数据时连接立即关闭,而又超时却没有?

1 个答案:

答案 0 :(得分:1)

TCP是可靠的协议。即使客户端发送数据并关闭了连接,在需要重新传输数据包的情况下,该连接也会保留一段时间。几分钟后TIME_WAIT将消失。有一个SO_LINGER选项可以控制超时。