You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tauri中manager.emit_all()实现:如何向前端传递response_json

Tauri中TCP服务向前端传递数据的具体实现

核心思路

要在TCP的handle_client函数里调用emit_all,关键是让TCP处理线程能拿到Tauri的AppHandle(它实现了Manager trait,自带emit_all方法),同时保证线程安全。

具体实现步骤

  1. 在main函数中获取并传递AppHandle
    在Tauri的setup钩子中拿到AppHandle,启动TCP服务时克隆一份传入,让TCP线程能访问事件管理器。

  2. 修改handle_client函数接收AppHandle参数
    把AppHandle作为参数传给handle_client,生成response_json后直接调用emit_all发送事件到前端。

  3. 前端监听对应事件
    前端通过Tauri的事件API监听后端发送的事件,接收并处理response_json数据。

完整代码示例

main.rs代码

use std::io::{BufRead, BufReader, Write};
use std::net::{TcpListener, TcpStream};
use std::thread;
use tauri::{AppHandle, Manager};

// 处理客户端连接的函数,接收AppHandle参数
fn handle_client(mut stream: TcpStream, app_handle: AppHandle) {
    let reader = BufReader::new(&mut stream);
    for line in reader.lines() {
        let input = line.unwrap();
        // 这里替换成你的业务逻辑,生成目标response_json
        let response_json = format!("{{\"result\": \"processed: {}\"}}", input);
        
        // 发送数据到所有前端窗口
        if let Err(e) = app_handle.emit_all("tcp:response", response_json.clone()) {
            eprintln!("Failed to emit event: {}", e);
        }
        
        // 可选:给TCP客户端返回响应
        if let Err(e) = stream.write_all(response_json.as_bytes()) {
            eprintln!("Failed to write to stream: {}", e);
        }
    }
}

fn start_tcp_server(app_handle: AppHandle) {
    let listener = match TcpListener::bind("127.0.0.1:8080") {
        Ok(l) => l,
        Err(e) => {
            eprintln!("Failed to start TCP server: {}", e);
            return;
        }
    };
    println!("TCP server running on 127.0.0.1:8080");

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                // 克隆AppHandle传给新线程
                let app_clone = app_handle.clone();
                thread::spawn(move || {
                    handle_client(stream, app_clone);
                });
            }
            Err(e) => {
                eprintln!("Connection failed: {}", e);
            }
        }
    }
}

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            // 启动TCP服务,传入AppHandle
            let app_handle = app.handle();
            thread::spawn(move || {
                start_tcp_server(app_handle);
            });
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

前端代码(示例:index.html中的JS)

<script type="module">
  import { listen } from '@tauri-apps/api/event';

  // 监听后端发送的tcp:response事件
  async function initTcpListener() {
    await listen('tcp:response', (event) => {
      console.log('收到TCP响应:', event.payload);
      // 这里替换成你的前端处理逻辑,比如渲染到页面
      document.getElementById('response-container').textContent = event.payload;
    });
  }

  initTcpListener();
</script>

注意事项

  • AppHandle是线程安全的(实现了Send + Sync),可以安全克隆后传入TCP处理线程。
  • 前后端的事件名(比如tcp:response)必须完全一致,避免拼写错误导致接收失败。
  • 如果response_json是复杂JSON对象,后端可以用serde序列化为字符串,前端再用JSON.parse()解析。

内容的提问来源于stack exchange,提问作者cocretapoyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:56:19