From 976eb1baf16c5db65120baf0d7a3ebcc5b9eeb9f Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 12 Jun 2025 14:27:20 +0800 Subject: [PATCH] add windows client --- Windows-client/build.bat | 26 +++++++ Windows-client/win_udp_listener.py | 66 ++++++++++++++++++ .../build.sh | 0 .../src/linux_udp_client.py | 0 {server => linux-server}/broadcaster | Bin {server => linux-server}/broadcaster.go | 0 {server => linux-server}/build.sh | 0 7 files changed, 92 insertions(+) create mode 100644 Windows-client/build.bat create mode 100644 Windows-client/win_udp_listener.py rename {linux-desktop => linux-desktop-client}/build.sh (100%) rename {linux-desktop => linux-desktop-client}/src/linux_udp_client.py (100%) rename {server => linux-server}/broadcaster (100%) mode change 100755 => 100644 rename {server => linux-server}/broadcaster.go (100%) rename {server => linux-server}/build.sh (100%) diff --git a/Windows-client/build.bat b/Windows-client/build.bat new file mode 100644 index 0000000..535e3a7 --- /dev/null +++ b/Windows-client/build.bat @@ -0,0 +1,26 @@ +@echo off +setlocal + +echo === Activating virtual environment === +call venv310\Scripts\activate.bat +if errorlevel 1 ( + echo [ERROR] Failed to activate virtual environment! + pause + exit /b 1 +) + +echo === Installing PyInstaller (if not present) === +pip show pyinstaller >nul 2>&1 +if errorlevel 1 ( + echo Installing PyInstaller... + pip install pyinstaller +) else ( + echo PyInstaller already installed. +) + +echo === Building win_udp_listener.exe === +pyinstaller --noconsole --onefile win_udp_listener.py + +echo. +echo === Build complete! Check the dist\ directory. === +pause diff --git a/Windows-client/win_udp_listener.py b/Windows-client/win_udp_listener.py new file mode 100644 index 0000000..0171abc --- /dev/null +++ b/Windows-client/win_udp_listener.py @@ -0,0 +1,66 @@ +import socket +import json +import threading +import webbrowser +import tkinter as tk +from tkinter import messagebox + +UDP_PORT = 9876 +popup_shown = False # 确保只弹一次 + +def open_browser(url): + try: + webbrowser.open(url) + except Exception as e: + print(f"Failed to open browser: {e}") + +def listen_udp(): + global popup_shown + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind(("", UDP_PORT)) + + print(f"Listening for UDP broadcasts on port {UDP_PORT}...") + + while True: + try: + data, addr = sock.recvfrom(1024) + print(f"Received raw data from {addr}: {data}") + msg = json.loads(data.decode("utf-8")) + + if msg.get("type") == "ai_server_announce": + ip = msg.get("ip") + port = msg.get("port") + name = msg.get("name", "Unknown") + + url = f"http://{ip}:80" + print(f"Discovered {name} at {url}") + + if not popup_shown: + popup_shown = True + + def show_popup(): + if messagebox.askyesno("发现AI服务器", f"名称: {name}\n地址: {url}\n\n是否打开浏览器访问?"): + open_browser(url) + + root.after(0, show_popup) + + except json.JSONDecodeError: + print("Failed to decode JSON") + except Exception as e: + print(f"Error while receiving UDP: {e}") + +# 初始化 Tkinter 主窗口(显示) +root = tk.Tk() +root.title("AI 服务器发现工具") +root.geometry("400x200") +label = tk.Label(root, text="正在监听 AI 服务器广播...\n端口: 9876", font=("Arial", 12)) +label.pack(pady=60) + +# 启动监听线程 +listener_thread = threading.Thread(target=listen_udp, daemon=True) +listener_thread.start() + +# 启动 UI 主循环 +root.mainloop() diff --git a/linux-desktop/build.sh b/linux-desktop-client/build.sh similarity index 100% rename from linux-desktop/build.sh rename to linux-desktop-client/build.sh diff --git a/linux-desktop/src/linux_udp_client.py b/linux-desktop-client/src/linux_udp_client.py similarity index 100% rename from linux-desktop/src/linux_udp_client.py rename to linux-desktop-client/src/linux_udp_client.py diff --git a/server/broadcaster b/linux-server/broadcaster old mode 100755 new mode 100644 similarity index 100% rename from server/broadcaster rename to linux-server/broadcaster diff --git a/server/broadcaster.go b/linux-server/broadcaster.go similarity index 100% rename from server/broadcaster.go rename to linux-server/broadcaster.go diff --git a/server/build.sh b/linux-server/build.sh similarity index 100% rename from server/build.sh rename to linux-server/build.sh