diff --git a/central.Dockerfile b/central.Dockerfile new file mode 100644 index 0000000..9ec4c12 --- /dev/null +++ b/central.Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.8-slim + +EXPOSE 80 +WORKDIR /app +RUN pip install --no-cache-dir websockets asyncudp + +COPY central.py /app/ +STOPSIGNAL SIGINT +ENTRYPOINT ["python", "-u", "central.py"] diff --git a/central.py b/central.py new file mode 100644 index 0000000..c8bc100 --- /dev/null +++ b/central.py @@ -0,0 +1,36 @@ +import os +import asyncio +import websockets +import asyncudp + +UDP_IP = os.getenv("UDP_IP", "127.0.0.1") +UDP_PORT = int(os.getenv("UDP_PORT", 12345)) + +async def websocket_handler(websocket): + udp_socket = await asyncudp.create_socket(remote_addr=(UDP_IP, UDP_PORT)) + print("Received new connection from", websocket.remote_address) + + async def forward_to_websocket(udp_socket, websocket): + while True: + data, addr = await udp_socket.recvfrom() + await websocket.send(data) + + task1 = asyncio.create_task(forward_to_websocket(udp_socket, websocket)) + + try: + async for message in websocket: + udp_socket.sendto(message) + except websockets.exceptions.ConnectionClosed: + pass + finally: + print("Connection to", websocket.remote_address, "is closed") + task1.cancel() + udp_socket.close() + +async def main(): + async with websockets.serve(websocket_handler, "0.0.0.0", 80): + print("WebSocket server started") + while True: + await asyncio.sleep(3600) + +asyncio.run(main()) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9957889 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +services: + ws2udp: + build: + context: . + dockerfile: central.Dockerfile + ports: + - 80:80 + restart: always