paj*_*ajm 17 python sockets tcp nonblocking
有没有办法可以使用python的socket.accept()以非阻塞的方式运行它,让我只检查它是否有任何新的连接?我真的不想使用线程.谢谢.
Nat*_*ard 31
你可能想要类似的东西select.select()(见文档).您提供select()了三个套接字列表:您要监视的套接字是否具有可读性,可写性和错误状态.当新客户端等待时,服务器套接字将是可读的.
该select()函数将阻塞,直到其中一个套接字状态发生变化.timeout如果您不想永久阻止,可以指定可选的第四个参数.
这是一个愚蠢的echo服务器示例:
import select
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', 8888))
server_socket.listen(5)
print "Listening on port 8888"
read_list = [server_socket]
while True:
readable, writable, errored = select.select(read_list, [], [])
for s in readable:
if s is server_socket:
client_socket, address = server_socket.accept()
read_list.append(client_socket)
print "Connection from", address
else:
data = s.recv(1024)
if data:
s.send(data)
else:
s.close()
read_list.remove(s)
Run Code Online (Sandbox Code Playgroud)
Python同时使用epoll,poll以及kqueue用于支持它们的平台上实现.它们是更高效的版本select.
| 归档时间: |
|
| 查看次数: |
29397 次 |
| 最近记录: |