|
|
import socket |
|
|
import json |
|
|
from threading import Thread |
|
|
from queue import Queue |
|
|
import threading |
|
|
import queue |
|
|
|
|
|
from CPR_Module.Common.logging_config import cpr_logger |
|
|
|
|
|
class AnalysisSocketServer: |
|
|
def __init__(self, host='localhost', port=5000): |
|
|
self.host = host |
|
|
self.port = port |
|
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|
|
self.conn = None |
|
|
self.running = False |
|
|
self.warning_queue = Queue() |
|
|
self.connection_event = threading.Event() |
|
|
cpr_logger.info(f"[SOCKET] Server initialized on {host}:{port}") |
|
|
|
|
|
def start_server(self): |
|
|
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
|
|
self.sock.bind((self.host, self.port)) |
|
|
self.sock.listen() |
|
|
self.running = True |
|
|
Thread(target=self._accept_connections, daemon=True).start() |
|
|
|
|
|
def _accept_connections(self): |
|
|
while self.running: |
|
|
try: |
|
|
self.conn, addr = self.sock.accept() |
|
|
cpr_logger.info(f"[SOCKET] Connected by {addr}") |
|
|
self.connection_event.set() |
|
|
Thread(target=self._handle_client, args=(self.conn,), daemon=True).start() |
|
|
except Exception as e: |
|
|
|
|
|
cpr_logger.error(f"[SOCKET] Connection error: {str(e)}") |
|
|
|
|
|
def wait_for_connection(self, timeout=None): |
|
|
"""Block until a client connects""" |
|
|
|
|
|
cpr_logger.error("[SOCKET] Waiting for client connection...") |
|
|
self.connection_event.clear() |
|
|
return self.connection_event.wait(timeout) |
|
|
|
|
|
def _handle_client(self, conn): |
|
|
while self.running: |
|
|
try: |
|
|
|
|
|
warnings = self.warning_queue.get(block=True, timeout=0.1) |
|
|
serialized = json.dumps(warnings) + "\n" |
|
|
conn.sendall(serialized.encode('utf-8')) |
|
|
except queue.Empty: |
|
|
continue |
|
|
except (BrokenPipeError, ConnectionResetError): |
|
|
cpr_logger.error("[SOCKET] Client disconnected") |
|
|
break |
|
|
except Exception as e: |
|
|
cpr_logger.error(f"[SOCKET] Error: {str(e)}") |
|
|
break |
|
|
conn.close() |
|
|
|
|
|
def stop_server(self): |
|
|
self.running = False |
|
|
self.sock.close() |
|
|
cpr_logger.info("[SOCKET] Server stopped") |