python socket.socket 怎么监听关闭
时间: 2023-07-23 14:34:50 浏览: 59
在 Python 中,使用 `socket` 模块创建的 `socket.socket` 对象可以通过 `close()` 方法来关闭。如果你要监听 socket 对象的关闭事件,可以使用 `select` 模块中的 `select()` 函数,该函数可以监视一组文件描述符(包括 socket 对象),并在其中任何一个文件描述符上发生事件时返回。在监听 socket 关闭事件时,你可以将 socket 对象的文件描述符添加到 `select()` 函数的监视列表中,然后在函数返回后检查该 socket 对象是否异常关闭(即是否出现了 `select.POLLHUP` 或 `select.POLLERR` 事件),如果出现了异常事件,则说明该 socket 对象已经关闭。下面是一个简单的示例代码:
```python
import socket
import select
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
# 将 server socket 对象的文件描述符添加到监视列表中
poll = select.poll()
poll.register(server_socket.fileno(), select.POLLIN | select.POLLHUP | select.POLLERR)
while True:
# 等待事件发生
events = poll.poll()
for fileno, event in events:
if fileno == server_socket.fileno():
# 接收到客户端连接请求
client_socket, client_address = server_socket.accept()
print('New client connected:', client_address)
# 将新的 client socket 对象的文件描述符添加到监视列表中
poll.register(client_socket.fileno(), select.POLLIN | select.POLLHUP | select.POLLERR)
else:
# 读取客户端发送的数据
client_socket = socket.fromfd(fileno, socket.AF_INET, socket.SOCK_STREAM)
data = client_socket.recv(1024)
if not data:
# 检查 socket 对象是否异常关闭
if event & (select.POLLHUP | select.POLLERR):
print('Client closed:', client_socket.getpeername())
else:
print('Client disconnected:', client_socket.getpeername())
# 将 client socket 对象的文件描述符从监视列表中移除
poll.unregister(fileno)
client_socket.close()
else:
print('Received data from', client_socket.getpeername(), ':', data.decode())
```
该示例代码中使用了 `select.poll()` 函数来监听 socket 对象的事件,如果事件包括 `select.POLLHUP` 或 `select.POLLERR`,则说明该 socket 对象已经关闭。注意,在检查 socket 对象是否异常关闭时,需要使用 `socket.fromfd()` 函数从文件描述符获取 socket 对象。