diff --git a/server-node-bridge/bridge.py b/server-node-bridge/bridge.py new file mode 100644 index 0000000000000000000000000000000000000000..f8a2e335ce73dd6f72e330f8da9988331c11b9fe --- /dev/null +++ b/server-node-bridge/bridge.py @@ -0,0 +1,92 @@ +import asyncio +import websockets + +# 스프링 서버 => c 서버 +async def receive_messages(websocket, writer): + try: + while True: + # 웹소켓 메세지 송신 + message = await websocket.recv() + + # 소켓으로 전달 + writer.write(message.encode()) + await writer.drain() + print(f"Received from spring server : {message}") + except websockets.ConnectionClosed: + print("Spring server close") + +# c 서버 => 스프링 서버 +async def send_messages(websocket, initial_message, reader): + try: + await websocket.send(initial_message) + while True: + + # 소켓 메세지 송신 + data = await reader.read(1024) + if not data: + break + message = data.decode().strip() + print(f"Received from client : {message}") + # 웹소켓으로 전달 + await websocket.send(message) + except websockets.ConnectionClosed: + print("Spring server close") + +# 연결 관리 +async def handle_client(reader, writer): + + addr = writer.get_extra_info('peername') + print(f"{addr} accepted") + + try: + while True: + # C 서버 메세지 read + data = await reader.read(1024) + if not data: + print(f"{addr} disconnected") + break + + initial_message = data.decode().strip() + print(f"Received from client : {initial_message}") + + uri = "ws://localhost:8080/ws/charger" + + # spring 서버 웹소켓으로 연결 후 초기 메세지 전송 + try: + async with websockets.connect(uri) as websocket: + send_thread = asyncio.create_task(send_messages(websocket, initial_message, reader)) + receive_thread = asyncio.create_task(receive_messages(websocket, writer)) + + await asyncio.gather(send_thread, receive_thread, return_exceptions=True) + + # 서버 종료 처리 + except websockets.ConnectionClosed: + print("Spring server disconneted") + + # 그외 예외 처리 + except Exception as e: + print(f"Spring server connect error {e}") + break + # c 서버 종료 + except asyncio.CancelledError: + print(f"{addr} client disconnected") + + # 자원 반환 + finally: + print(f"{addr} client session close") + writer.close() + await writer.wait_closed() + +async def main(): + + host = '127.0.0.1' + port = 49152 + + # 파이썬 Bridge 서버 실행 + server = await asyncio.start_server(handle_client, host, port) + print(f"Bridge Server Start {host}:{port}") + + async with server: + await server.serve_forever() + +asyncio.run(main())