micropython-samples/uasyncio_iostream/poll/client_w.py

56 wiersze
1.9 KiB
Python

# client_w.py Test poll object's response to two fault conditions under Unix and ESP8266
import usocket as socket
import uasyncio as asyncio
import uselect as select
server_addr = socket.getaddrinfo('192.168.0.35', 8123)[0][-1]
s = socket.socket()
s.connect(server_addr) # Expect OSError if server down
poller = select.poll()
poller.register(s, select.POLLOUT)
s.setblocking(False)
success = False
async def run():
global success
ok = True
try:
while ok:
res = poller.ipoll(10)
for sock, ev in res:
if ev & select.POLLOUT:
r = sock.send(b'0123456789\n')
print(ev, r)
# On ESP8266 if another task closes the socket the poll object
# never triggers. uasyncio expects it to trigger with POLLHUP or
# (POLLOUT & POLLERR or POLLOUT & POLLHUP)
# If server fails gets OSError on both platforms.
else: # But on Unix socket closure produces ev == 32
print('Terminating event:', ev) # What is 32??
ok = False
break
await asyncio.sleep(1)
await asyncio.sleep(0)
except OSError:
print('Got OSError') # Happens on ESP8266 if server fails
success = True # Detected socket closure or error by OSError or event
async def killer():
await asyncio.sleep(5)
print('closing socket')
s.close()
for n in range(3, -1, -1):
print('Shutdown in {}s'.format(n)) # Leave time for response from run()
await asyncio.sleep(1)
if success:
print('Success: detected error/socket closure.')
else:
print('Failed to detect error/socket closure.')
loop = asyncio.get_event_loop()
loop.create_task(run())
try:
loop.run_until_complete(killer())
finally:
s.close()