diff --git a/src/py_dvt_ate/app/dashboard/app.py b/src/py_dvt_ate/app/dashboard/app.py index 27fd289..7bfd933 100644 --- a/src/py_dvt_ate/app/dashboard/app.py +++ b/src/py_dvt_ate/app/dashboard/app.py @@ -107,6 +107,16 @@ class TestProgress: return time.time() - self.started_at +def _is_server_responsive(host: str = "127.0.0.1", port: int = 5001) -> bool: + """Check if a server is actually responding on the given port.""" + import socket + try: + with socket.create_connection((host, port), timeout=0.5): + return True + except (OSError, ConnectionRefusedError, TimeoutError): + return False + + def get_or_create_server() -> SimulationServer: """Get or create the simulation server singleton. @@ -118,9 +128,14 @@ def get_or_create_server() -> SimulationServer: """ global _simulation_server, _server_thread - # Return existing server if it's running + # Return existing server if it's running AND responsive if _simulation_server is not None and _simulation_server.is_running: - return _simulation_server + # Verify the server is actually responding (not a stale flag) + if _is_server_responsive(): + return _simulation_server + # Server flag says running but it's not responsive - clean up + _simulation_server = None + _server_thread = None # Create new server server = SimulationServer( diff --git a/src/py_dvt_ate/instruments/transport/server.py b/src/py_dvt_ate/instruments/transport/server.py index 0e6d248..544df04 100644 --- a/src/py_dvt_ate/instruments/transport/server.py +++ b/src/py_dvt_ate/instruments/transport/server.py @@ -138,6 +138,7 @@ class InstrumentServer: handler, self._host, port, + reuse_address=True, ) self._servers.append(server) logger.info(