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

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

在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 相关产品和应用

全部下载

专题列表