1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
#!/usr/bin/env python3
"""websocket cmd client for wssrv.py example."""
import argparse
import signal
import sys
import asyncio
try:
import selectors
except ImportError:
from asyncio import selectors
import aiohttp
def start_client(loop, url):
name = input('Please enter your name: ')
# send request
ws = yield from aiohttp.ws_connect(url, autoclose=False, autoping=False)
# input reader
def stdin_callback():
line = sys.stdin.buffer.readline().decode('utf-8')
if not line:
loop.stop()
else:
ws.send_str(name + ': ' + line)
loop.add_reader(sys.stdin.fileno(), stdin_callback)
@asyncio.coroutine
def dispatch():
while True:
msg = yield from ws.receive()
if msg.tp == aiohttp.MsgType.text:
print('Text: ', msg.data.strip())
elif msg.tp == aiohttp.MsgType.binary:
print('Binary: ', msg.data)
elif msg.tp == aiohttp.MsgType.ping:
ws.pong()
elif msg.tp == aiohttp.MsgType.pong:
print('Pong received')
else:
if msg.tp == aiohttp.MsgType.close:
yield from ws.close()
elif msg.tp == aiohttp.MsgType.error:
print('Error during receive %s' % ws.exception())
elif msg.tp == aiohttp.MsgType.closed:
pass
break
yield from dispatch()
ARGS = argparse.ArgumentParser(
description="websocket console client for wssrv.py example.")
ARGS.add_argument(
'--host', action="store", dest='host',
default='127.0.0.1', help='Host name')
ARGS.add_argument(
'--port', action="store", dest='port',
default=8080, type=int, help='Port number')
if __name__ == '__main__':
args = ARGS.parse_args()
if ':' in args.host:
args.host, port = args.host.split(':', 1)
args.port = int(port)
url = 'http://{}:{}'.format(args.host, args.port)
loop = asyncio.SelectorEventLoop(selectors.SelectSelector())
asyncio.set_event_loop(loop)
loop.add_signal_handler(signal.SIGINT, loop.stop)
asyncio.Task(start_client(loop, url))
loop.run_forever()
|