giambio/tests/server.py

46 lines
1.4 KiB
Python
Raw Normal View History

2020-03-19 19:48:24 +01:00
import giambio
from giambio.socket import AsyncSocket
2020-03-19 19:48:24 +01:00
import socket
import logging
sched = giambio.AsyncScheduler()
2020-03-19 19:48:24 +01:00
2020-07-13 22:02:31 +02:00
logging.basicConfig(
level=20, format="[%(levelname)s] %(asctime)s %(message)s", datefmt="%d/%m/%Y %p"
)
2020-03-19 19:48:24 +01:00
async def server(address: tuple):
2020-03-19 19:48:24 +01:00
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(address)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.listen(5)
asock = sched.wrap_socket(sock)
2020-03-19 19:48:24 +01:00
logging.info(f"Echo server serving asynchronously at {address}")
while True:
conn, addr = await asock.accept()
logging.info(f"{addr} connected")
task = sched.create_task(echo_handler(conn, addr))
2020-06-17 16:23:43 +02:00
2020-03-19 19:48:24 +01:00
async def echo_handler(sock: AsyncSocket, addr: tuple):
2020-03-19 19:48:24 +01:00
with sock:
await sock.send_all(b"Welcome to the server pal!\n")
while True:
data = await sock.receive(1000)
if not data:
break
to_send_back = data
2020-07-13 22:02:31 +02:00
data = data.decode("utf-8").encode("unicode_escape")
2020-03-19 19:48:24 +01:00
logging.info(f"Got: '{data.decode('utf-8')}' from {addr}")
await sock.send_all(b"Got: " + to_send_back)
logging.info(f"Echoed back '{data.decode('utf-8')}' to {addr}")
logging.info(f"Connection from {addr} closed")
if __name__ == "__main__":
try:
2020-07-13 22:02:31 +02:00
sched.start(server(("", 25001)))
except KeyboardInterrupt: # Exceptions propagate!
print("Exiting...")