socket select 等待 accept 代码
时间: 2023-06-19 14:04:19 浏览: 102
下面是一个使用 select 等待 accept 的示例代码:
```python
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen(5)
sockets_list = [server_socket]
while True:
read_sockets, _, _ = select.select(sockets_list, [], [])
for sock in read_sockets:
if sock == server_socket:
client_socket, client_address = server_socket.accept()
sockets_list.append(client_socket)
print('Accepted new connection from {}:{}'.format(*client_address))
else:
data = sock.recv(1024)
if data:
print(data.decode())
else:
sock.close()
sockets_list.remove(sock)
print('Connection closed')
```
在上面的代码中,我们首先创建了一个服务器套接字 `server_socket`,并将其绑定到本地主机的端口 8000 上。然后,我们使用 `select` 函数来等待新的连接。在每次循环中,我们调用 `select` 函数并传入一个包含 `server_socket` 的套接字列表 `sockets_list`,以及空的读取、写入和错误列表。`select` 函数将阻塞,直到有一个套接字处于可读状态,然后返回可读套接字的列表 `read_sockets`。
我们遍历 `read_sockets` 列表,如果其中的套接字是 `server_socket`,则表示有新的客户端连接请求。我们调用 `accept` 方法来接受连接请求,并将新的客户端套接字 `client_socket` 添加到 `sockets_list` 列表中。我们还打印出客户端的地址和端口号。
如果读取的套接字不是 `server_socket`,则表示有数据到达。我们使用 `recv` 方法来接收数据,并将其打印到控制台上。
最后,如果 `recv` 方法返回空数据,则表示客户端已关闭连接。我们关闭套接字并从 `sockets_list` 列表中删除该套接字。
阅读全文