首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Python3TCP客户端不关闭连接?

为什么Python3TCP客户端不关闭连接?
EN

Stack Overflow用户
提问于 2019-05-23 13:16:51
回答 1查看 936关注 0票数 0

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

服务器代码

代码语言:javascript
复制
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()

客户代码

代码语言:javascript
复制
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()

启动服务器将导致:

代码语言:javascript
复制
tcp    LISTEN   0    1    127.0.0.1:65432    0.0.0.0:* 

在运行客户端之后,我期望相同的状态,但是客户端连接是打开的。

代码语言:javascript
复制
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

但如果我取消评论如下:

代码语言:javascript
复制
#s.sendall('Hello world, again'.encode())

结果如我所料。

代码语言:javascript
复制
tcp    LISTEN   0    1    127.0.0.1:65432    0.0.0.0:* 

为什么在没有第二次数据发送和超时的情况下立即关闭连接?

EN

回答 1

Stack Overflow用户

发布于 2019-05-23 20:31:11

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56276130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档