当前位置: 首页 > news >正文

tauri2项目在本地启动一个服务器,并支持控制停止还是启动

使用的是warp这个依赖库,这个依赖库是一个开源的rust server库,开源地址:https://github.com/seanmonstar/warp,使用起来也是非常的方便,只需要添加到自己本地cargo.toml依赖中,并跟上tokio这个依赖项。

tokio = { version = "1", features = ["full"] }
warp = "0.3"

然后在新创建两个函数,用于被前端调用:

mod command;
use std::sync::{Arc, Mutex};
mod utils;
use tauri::menu::*;

struct ServerState {
    server_handle: Option<tokio::task::JoinHandle<()>>,
}

#[tauri::command]
async fn start_server(
    state: tauri::State<'_, Arc<Mutex<ServerState>>>,
    path: String,
) -> Result<(), String> {
    println!("start_server: {}", path);
    let mut state = state.lock().unwrap();
    if state.server_handle.is_some() {
        return Err("Server is already running".into());
    }
    let path_clone = path.clone();
    let server_handle = tokio::spawn(async move {
        let route = warp::fs::dir(path_clone);
        warp::serve(route).run(([127, 0, 0, 1], 3030)).await;
    });
    state.server_handle = Some(server_handle);
    println!("Server started at http://127.0.0.1:3030");
    Ok(())
}

#[tauri::command]
async fn stop_server(state: tauri::State<'_, Arc<Mutex<ServerState>>>) -> Result<(), String> {
    let mut state = state.lock().unwrap();
    println!("stop_server");
    if let Some(handle) = state.server_handle.take() {
        handle.abort();
        Ok(())
    } else {
        Err("Server is not running".into())
    }
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]

再将server_handle添加到tauri中管理:

    tauri::Builder::default()
        .manage(Arc::new(Mutex::new(ServerState {
            server_handle: None,
        })))

并将启动和关闭两个函数添加到invoke_handler中:

然后在前端js中进行调用启动和关闭即可:

# selected是用户选择的一个文件夹路径
await invoke('start_server', { path: selected })
console.log('Server started successfully')

# 关闭
const stopServer = () => {
    invoke('stop_server')
}

最后就可以看到效果了:

相关文章:

  • FPGA-DE2115开发板实现流水灯
  • 更改 docker0 IP
  • 第五章-PHP函数
  • 批处理脚本编译vs工程
  • LoRA中黑塞矩阵、Fisher信息矩阵是什么
  • C++中new和delete如何构建简单对象和复杂对象?
  • c++介绍进程间的通信一
  • K8s认证(CKA/CKAD/CKS)哪家强?主流证书对比
  • 《Linux 网络架构:基于 TCP 协议的多人聊天系统搭建详解》
  • Zookeeper 集群部署与管理实践
  • 第4章:Docker安装与环境配置:多平台部署指南
  • 流程图软件推荐,好用的流程图工具分享
  • 解决Qt信号在构造函数中失效的问题
  • DataWhale大语言模型-大模型技术基础
  • Git Worktree 实现 “一边修生产Bug,一边写新需求”
  • C++左值右值
  • vscode 配置服务器远程连接
  • VLLM专题(三十一)—架构概述
  • doris:审计日志
  • C#通过SignalR直接返回流式响应内容
  • 俄总统助理:普京与美特使讨论了恢复俄乌直接谈判的可能性
  • 由重商主义观察世界现代化历程
  • 福特中国CFO:依然坚信中国市场,上海帮助公司吸引到人才
  • 助力中国足球未来,香港赛马会鼎力支持U15国少选拔队赴英训练
  • 视频·世界读书日|林乾:碎片化阅读或影视综艺≠知识
  • 江西九江市人大常委会原副主任戴晓慧主动交代问题,接受审查调查