非阻塞套接字

socket 

在建立连接和数据传输的时候,都会存在等待,就是一种阻塞,一次只能服务一个客户端,排队机制,会存在资源的浪费,cpu的浪费,是不可取的

非阻塞套接字

就是将连接和接收的阻塞位置变成错误,再通过try进行捕获错误BlockingIOError,pass掉

try:
    conn,addr = server.accept()
    conn.setblocking(False)
except BlockingIOError:
    pass

建立费阻塞套接字的方法是:

套接字.setblocking(False)

用非阻塞创建一个服务端:可同时处理多个客户请求

扫描二维码关注公众号,回复: 2675229 查看本文章
import socket
server = socket.socket()
server.setblocking(False)   # 设置为非阻塞套接字
server.bind(('', 7790))
server.listen(5)
all_conn = []
while True:
    try:
        conn, addr = server.accept()
        conn.setblocking(False)  # 新的非阻塞套接字,没有连接会报错
        all_conn.append(conn)    # 保存记录连接的客户端
    except BlockingIOError:     # 捕获错误pass掉
        pass
    for conn in all_conn:
        try:
            recv_data = conn.recv(1024)
            if recv_data:
                print(str(addr) + '>>>' + recv_data.decode())
                conn.send(recv_data)
            else:
                conn.close()
                all_conn.remove(conn)
        except BlockingIOError:    
            pass

猜你喜欢

转载自www.cnblogs.com/pywjh/p/9456208.html