- signal_handler вызывает shutdown() который блокируется - Убран sys.exit(0) из signal handler - serve_forever() завершается через KeyboardInterrupt - finally закрывает сокет корректно
91 lines
2.7 KiB
Python
Executable File
91 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Simple HTTP server for WebSocket client testing.
|
|
|
|
Usage:
|
|
python3 start_web_server.py [--port PORT]
|
|
|
|
Open in browser:
|
|
http://localhost:PORT/client.html
|
|
"""
|
|
|
|
import argparse
|
|
import http.server
|
|
import socketserver
|
|
import os
|
|
import signal
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
PORT = 8080
|
|
SCRIPT_DIR = Path(__file__).parent.resolve()
|
|
|
|
# Global server reference for cleanup
|
|
httpd = None
|
|
|
|
|
|
class CustomHandler(http.server.SimpleHTTPRequestHandler):
|
|
"""Custom handler with better logging."""
|
|
|
|
def do_GET(self):
|
|
super().do_GET()
|
|
print(f"[WebServer] ✅ {self.requestline} → {self.command} {self.path}")
|
|
|
|
def log_message(self, format, *args):
|
|
# Suppress default logging
|
|
pass
|
|
|
|
|
|
def signal_handler(sig, frame):
|
|
"""Handle Ctrl+C gracefully."""
|
|
print("\n👋 Shutting down...")
|
|
if httpd:
|
|
# Use shutdown() to stop serve_forever()
|
|
httpd.shutdown()
|
|
|
|
|
|
def main():
|
|
global httpd
|
|
|
|
parser = argparse.ArgumentParser(description='WebSocket Client Web Server')
|
|
parser.add_argument('--port', type=int, default=PORT, help=f'Port (default: {PORT})')
|
|
parser.add_argument('--host', default='0.0.0.0', help='Host (default: 0.0.0.0)')
|
|
args = parser.parse_args()
|
|
|
|
# Change to websocket-service directory
|
|
os.chdir(SCRIPT_DIR)
|
|
|
|
# Register signal handlers
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
signal.signal(signal.SIGTERM, signal_handler)
|
|
|
|
# Allow socket reuse
|
|
socketserver.TCPServer.allow_reuse_address = True
|
|
|
|
print(f"""
|
|
╔══════════════════════════════════════════════════════════╗
|
|
║ 🛰️ Wyoming Satellite WebSocket Client Server ║
|
|
╠══════════════════════════════════════════════════════════╣
|
|
║ Serving: {str(SCRIPT_DIR):<45} ║
|
|
║ URL: http://localhost:{args.port:<36} ║
|
|
║ Remote: http://<your-ip>:{args.port:<32} ║
|
|
║ ║
|
|
║ Press Ctrl+C to stop ║
|
|
╚══════════════════════════════════════════════════════════╝
|
|
""")
|
|
|
|
httpd = socketserver.TCPServer((args.host, args.port), CustomHandler)
|
|
print(f"🚀 Server started on http://{args.host}:{args.port}")
|
|
|
|
try:
|
|
httpd.serve_forever()
|
|
except KeyboardInterrupt:
|
|
pass
|
|
finally:
|
|
print("\n👋 Server stopped")
|
|
httpd.server_close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|