非阻塞:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False)
sk.listen()
conn_l = []
del_conn =[]

while True:
    try:
        conn,addr = sk.accept()
        print('建立连接了:',addr)
        conn_l.append(conn)
    except BlockingIOError:
        for con in conn_l:
            try:
                msg = con.recv(1024)
                if msg == b'':
                    del_conn.append(con)
                    continue
                print(msg.decode('utf-8'))
                con.send(b'bye')
            except BlockingIOError:pass

        for con in del_conn:
            con.close()
            conn_l.remove(con)
        del_conn.clear()

多路复用:

import socket
import selectors

def accept(sk,mask):
    conn,addr = sk.accept()
    sel.register(conn,selectors.EVENT_READ,read)

def read(conn,mask):
    try:
        data = conn.recv(1024)
        if not data:
            print('closing',conn)
            sel.unregister(conn)
            conn.close()
            return
        conn.send(data.upper()+b'_SB')
    except Exception:
        print('closing',conn)
        sel.unregister(conn)
        conn.close()



sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
sk.setblocking(False)

sel = selectors.DefaultSelector()   # 选择适合的机制
sel.register(sk,selectors.EVENT_READ,accept)

while True:
    events = sel.select()   # 检测所有对象,是否有完成等待数据阶段
    for sel_obj,maskin in events:
        callback = sel_obj.data
        callback(sel_obj.fileobj,mask)