程序完成,只需要添加图标和关闭CMD窗口即可

This commit is contained in:
iorebuild 2025-08-08 00:04:52 +08:00
parent bec0d21d20
commit 01b37916c1
3 changed files with 56 additions and 18 deletions

View File

@ -4,7 +4,7 @@ version = "1.0.0"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
tokio = "1.47.1" tokio = { version = "1.47.1", features = ["full"] }
async-tftp = "0.3.6" async-tftp = "0.3.6"
slint = "1.12.1" slint = "1.12.1"
rfd = "0.15.4" rfd = "0.15.4"

View File

@ -14,6 +14,7 @@ export component MainWindow inherits Window {
callback StartTftp(); callback StartTftp();
//停止回调 //停止回调
callback StopTftp(); callback StopTftp();
//选择路径按钮
Rectangle { Rectangle {
height: 35px; height: 35px;
width: 95px; width: 95px;

View File

@ -2,38 +2,75 @@ use async_tftp::server::TftpServerBuilder;
use async_tftp::Result; use async_tftp::Result;
use rfd::FileDialog; use rfd::FileDialog;
use slint::SharedString; use slint::SharedString;
use std::error::Error; use std::path::PathBuf;
// ?use smol::{prelude::*}; use tokio::task::{AbortHandle, JoinHandle};
use std::sync::{Arc, Mutex};
slint::include_modules!(); slint::include_modules!();
struct ServerState {
async fn StartTftpServer(Dir: &str) -> Result<()> { abort_handle: Option<AbortHandle>,
println!("Start Tftp Server Dir With:{Dir}");
let tftpd = TftpServerBuilder::with_dir_ro(Dir)?.build().await?;
tftpd.serve().await?;
Ok(())
} }
fn main() { async fn start_tftp_server(dir: PathBuf) -> Result<(JoinHandle<()>, AbortHandle)> {
let task = tokio::spawn(async move {
println!("Starting TFTP server at: {:?}", dir);
let tftpd = TftpServerBuilder::with_dir_ro(&dir)
.expect("Failed to create server")
.build()
.await
.expect("Failed to bind socket");
if let Err(e) = tftpd.serve().await {
eprintln!("Server error: {}", e);
}
});
let abort_handle = task.abort_handle();
Ok((task, abort_handle))
}
#[tokio::main]
async fn main() {
let ui = MainWindow::new().unwrap(); let ui = MainWindow::new().unwrap();
let state = Arc::new(Mutex::new(ServerState { abort_handle: None }));
let folder_path = Arc::new(Mutex::new(String::new()));
let path_clone = folder_path.clone();
//选择路径按钮的回调函数 //选择路径按钮的回调函数
ui.on_BrowserFolder(move || { ui.on_BrowserFolder(move || {
let result = FileDialog::new() let result = FileDialog::new()
.set_directory("/") .set_directory("/")
.pick_folder(); .pick_folder();
let path = result.map(|p| p.to_string_lossy().into_owned())
SharedString::from( .unwrap_or_default();
result.map(|p| p.to_string_lossy().into_owned()) *path_clone.lock().unwrap() = path.clone(); // 存储到变量
.unwrap_or_default() SharedString::from(path)
)
}); });
//启动按钮的回调函数 //启动按钮的回调函数
let state_clone = state.clone();
let path_clone = Arc::clone(&folder_path);
ui.on_StartTftp(move || { ui.on_StartTftp(move || {
// smol::spawn(StartTftpServer("C:/Users/anonymous/Desktop/Rust/VoiletTftp/target/release/")).detach(); // let Dir = PathBuf::from("C:/Users/anonymous/Desktop/Rust/VoiletTftp/target/release");
let dir = PathBuf::from(&*path_clone.lock().unwrap());
println!("{:?}",dir);
let state = state_clone.clone();
tokio::spawn(async move {
match start_tftp_server(dir).await {
Ok((_handle, abort_handle)) => {
println!("Server started");
// 存储 abort_handle 以便停止
state.lock().unwrap().abort_handle = Some(abort_handle);
}
Err(e) => eprintln!("Error: {}", e),
}
});
}); });
//停止按钮的回调函数 //停止按钮的回调函数
let state_clone = state.clone();
ui.on_StopTftp(move || { ui.on_StopTftp(move || {
if let Some(handle) = state_clone.lock().unwrap().abort_handle.take() {
handle.abort();
println!("Server stopped");
}
}); });
ui.run().unwrap(); ui.run().unwrap();
} }
//启动一个TFTP服务器帮我改写