import asyncio, datetime
def ts(): return datetime.datetime.now().strftime("%H:%M:%S")
async def handle(reader, writer, port):
    peer=writer.get_extra_info('peername')
    print(f"[{ts()}] CONN :{port} from {peer}",flush=True)
    try:
        data=await asyncio.wait_for(reader.read(4096), timeout=20)
        if not data:
            print(f"[{ts()}] :{port} (empty/closed)",flush=True); return
        if data[:1]==b'\x16':
            print(f"[{ts()}] :{port} *** TLS ClientHello (wss) {len(data)}B  {data[:16].hex()}",flush=True)
        elif data[:3]==b'GET':
            print(f"[{ts()}] :{port} *** WS upgrade (ws):\n{data[:700].decode('latin1')}",flush=True)
        else:
            print(f"[{ts()}] :{port} raw {len(data)}B: {data[:80].hex()}",flush=True)
    except asyncio.TimeoutError:
        print(f"[{ts()}] :{port} timeout (connected, no data)",flush=True)
    except Exception as e:
        print(f"[{ts()}] :{port} err {e}",flush=True)
    finally:
        try: writer.close()
        except: pass
async def main():
    for port in (5058,5059,443,8443,9090,9093,4530,5055):
        try:
            await asyncio.start_server(lambda r,w,p=port: handle(r,w,p),'0.0.0.0',port)
            print(f"LISTEN {port}",flush=True)
        except Exception as e:
            print(f"port {port}: {e}",flush=True)
    await asyncio.Event().wait()
asyncio.run(main())
