#!/usr/bin/env python3

import os
import asyncio

# 512 bytes
message = bytearray(512);
bufsize=len(message)
print('message len=', bufsize)

global recv
recv = 0

async def tcp_echo_open (ip, port):
    return await asyncio.open_connection(ip, port)

async def tcp_echo_sender(message, writer):
    print('Writer started')
    while True:
        writer.write(message)
        await writer.drain()

async def tcp_echo_receiver(message, reader):
    global recv
    print('Reader started')
    while True:
        data = ''.encode('utf8')
        while len(data) < bufsize:
            data += await reader.read(bufsize - len(data))
        recv += len(data);
        if data != message:
            print('error')

async def tcp_stat():
    global recv
    dur = 0
    loopsec = 2
    while True:
        last = recv
        await asyncio.sleep(loopsec) # drifting
        dur += loopsec
        print('BW=', (recv - last) * 2 * 8 / 1024 / loopsec, 'Kibits/s avg=', recv * 2 * 8 / 1024 / dur)

loop = asyncio.get_event_loop()
reader, writer = loop.run_until_complete(tcp_echo_open('echo23.local', 23))
loop.create_task(tcp_echo_receiver(message, reader))
loop.create_task(tcp_echo_sender(message, writer))
loop.create_task(tcp_stat())
loop.run_forever()