Python中真正关闭Socket的方法:close与shutdown的区别

凌晨两点半
凌晨两点半
发布时间:2026-10-11| 3人浏览过
原创

在Python网络编程中,正确关闭Socket连接至关重要。许多开发者误以为调用close()即可立即释放资源,但实际上,close()仅释放本地文件描述符,底层连接可能仍处于TIME_WAIT状态。要实现真正的、即时的连接关闭,必须使用shutdown()方法。本文将详细解析两者的区别及正确操作顺序。

为什么close()不够“彻底”?

在Python中,socket.close()方法的主要作用是释放与该Socket关联的本地资源(如文件描述符)。然而,它并不一定会立即终止底层的网络连接。调用close()后,连接可能进入TIME_WAIT状态,这意味着连接在系统层面并未完全清除,且此时通过accept()获取的连接对象可能已不可用或处于非预期状态。

使用shutdown()实现即时资源释放

若需立即释放连接资源,应使用socket.shutdown(how)方法。该方法会通知对端连接已关闭,并立即释放相关网络资源。shutdown()必须在close()之前调用,以确保连接被正确终止。

shutdown()的三种模式

shutdown()方法接受一个整数参数how,用于指定关闭的方向:

  • SHUT_RD (值为0):关闭接收消息通道。调用后,无法再从该Socket读取数据。
  • SHUT_WR (值为1):关闭发送消息通道。调用后,无法再向该Socket写入数据,但读取操作仍可进行(半关闭状态)。
  • SHUT_RDWR (值为2):同时关闭接收和发送通道。这是完全关闭连接的标准方式。

正确操作顺序

为确保连接被彻底且即时地关闭,请遵循以下操作顺序:

  1. 调用socket.shutdown(how),指定关闭模式(通常为SHUT_RDWR)。
  2. 调用socket.close(),释放本地资源。

示例代码:

import socket

# 创建Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))

# 发送数据
sock.sendall(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')

# 接收数据
response = sock.recv(4096)
print(response.decode())

# 正确关闭Socket
sock.shutdown(socket.SHUT_RDWR)  # 立即关闭连接
sock.close()  # 释放本地资源

注意事项

  • shutdown()必须在close()之前调用,否则无法实现即时关闭。
  • 若仅调用close(),连接可能仍处于TIME_WAIT状态,影响后续连接复用。
  • 根据实际需求选择合适的shutdown模式(SHUT_RD、SHUT_WR或SHUT_RDWR)。

以上就是Python中真正关闭Socket方法的详细内容,更多关于Python网络编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。