#!/usr/bin/env python3
import selectors
import socket
poll = selectors.DefaultSelector ()
clients = set ()
def accept (server, mask):
if mask & selectors.EVENT_READ:
while True:
try:
conn, addr = sock.accept ()
except BlockingIOError:
break
conn.setblocking (False)
poll.register (conn, selectors.EVENT_READ, read)
clients.add (conn)
mask &=~ selectors.EVENT_READ
assert mask == 0
def read (conn, mask):
if mask & selectors.EVENT_READ:
while True:
try:
data = conn.recv (4096)
except BlockingIOError:
break
if not data:
poll.unregister (conn)
clients.remove (conn)
conn.close ()
break
else:
for x in clients:
x.send (data) # Hope it won't block
mask &=~ selectors.EVENT_READ
assert mask == 0
sock = socket.socket ()
sock.bind (('0.0.0.0', 17241))
sock.listen (10)
sock.setblocking (False) # Важно!
poll.register (sock, selectors.EVENT_READ, accept)
while True:
events = poll.select ()
for key, mask in events:
callback = key.data
callback (key.fileobj, mask)