update from Atlas
This commit is contained in:
64
18-asyncio/charfinder/tcp_charfinder.py
Executable file
64
18-asyncio/charfinder/tcp_charfinder.py
Executable file
@@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# BEGIN TCP_CHARFINDER_TOP
|
||||
import sys
|
||||
import asyncio
|
||||
|
||||
from charfinder import UnicodeNameIndex # <1>
|
||||
|
||||
CRLF = b'\r\n'
|
||||
PROMPT = b'?> '
|
||||
|
||||
index = UnicodeNameIndex() # <2>
|
||||
|
||||
@asyncio.coroutine
|
||||
def handle_queries(reader, writer): # <3>
|
||||
while True: # <4>
|
||||
writer.write(PROMPT) # can't yield from! # <5>
|
||||
yield from writer.drain() # must yield from! # <6>
|
||||
data = yield from reader.readline() # <7>
|
||||
try:
|
||||
query = data.decode().strip()
|
||||
except UnicodeDecodeError: # <8>
|
||||
query = '\x00'
|
||||
client = writer.get_extra_info('peername') # <9>
|
||||
print('Received from {}: {!r}'.format(client, query)) # <10>
|
||||
if query:
|
||||
if ord(query[:1]) < 32: # <11>
|
||||
break
|
||||
lines = list(index.find_description_strs(query)) # <12>
|
||||
if lines:
|
||||
writer.writelines(line.encode() + CRLF for line in lines) # <13>
|
||||
writer.write(index.status(query, len(lines)).encode() + CRLF) # <14>
|
||||
|
||||
yield from writer.drain() # <15>
|
||||
print('Sent {} results'.format(len(lines))) # <16>
|
||||
|
||||
print('Close the client socket') # <17>
|
||||
writer.close() # <18>
|
||||
# END TCP_CHARFINDER_TOP
|
||||
|
||||
# BEGIN TCP_CHARFINDER_MAIN
|
||||
def main(address='127.0.0.1', port=2323): # <1>
|
||||
port = int(port)
|
||||
loop = asyncio.get_event_loop()
|
||||
server_coro = asyncio.start_server(handle_queries, address, port,
|
||||
loop=loop) # <2>
|
||||
server = loop.run_until_complete(server_coro) # <3>
|
||||
|
||||
host = server.sockets[0].getsockname() # <4>
|
||||
print('Serving on {}. Hit CTRL-C to stop.'.format(host)) # <5>
|
||||
try:
|
||||
loop.run_forever() # <6>
|
||||
except KeyboardInterrupt: # CTRL+C pressed
|
||||
pass
|
||||
|
||||
print('Server shutting down.')
|
||||
server.close() # <7>
|
||||
loop.run_until_complete(server.wait_closed()) # <8>
|
||||
loop.close() # <9>
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(*sys.argv[1:]) # <10>
|
||||
# END TCP_CHARFINDER_MAIN
|
||||
Reference in New Issue
Block a user