【问题标题】:Why is Python 3 TCP Client not closing connection?为什么 Python 3 TCP 客户端不关闭连接?
【发布时间】:2019-05-23 13:16:51
【问题描述】:

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

服务器代码

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:* 

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

【问题讨论】:

    标签: python sockets connection


    【解决方案1】:

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

    【讨论】:

    • 这不是问题的答案,通过发送两条没有协议超时的消息立即关闭连接。
    • @gogan 当我测试你的代码时,当第二条消息被发送并且客户端关闭连接而没有收到服务器的响应时,服务器引发了一个 connectionAbortedError,所以它没有返回LISTEN...它刚刚停止。那会立即关闭连接,我猜 :^)
    • 我没有收到错误消息,可能取决于 python 版本。我用3.7。运行客户端脚本后,连接立即关闭,第二条消息和服务器处于侦听状态。在双方,没有开放的连接。 “connectionAbortedError”将导致另一端的 tcp 超时,而不是关闭双方的连接。
    猜你喜欢
    • 2021-02-13
    • 2020-09-30
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2014-07-03
    • 2010-11-18
    • 2019-05-31
    相关资源
    最近更新 更多