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

如何在C++中访问及存取emscripten的会话数据

Emscripten 会话数据存储/读取方案及示例

可用搜索关键词

你可以使用以下关键词搜索相关资料:

  • emscripten session storage
  • emscripten localstorage
  • emscripten persistent storage
  • emscripten idbfs

方案1:直接调用浏览器Web API实现(适合小数据量)

该方案实现最简单,适合存储kv结构的轻量会话数据。SessionStorage 属于会话级存储,对应标签页关闭后数据会自动清除;替换代码中的sessionStorage为localStorage即可实现持久化存储,数据会长期保留在用户本地。

示例代码

#include <emscripten.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 存储数据到SessionStorage
EM_JS(void, save_session_data, (const char* key, const char* value), {
  const js_key = UTF8ToString(key);
  const js_value = UTF8ToString(value);
  window.sessionStorage.setItem(js_key, js_value);
});

// 从SessionStorage读取数据
EM_JS(const char*, load_session_data, (const char* key), {
  const js_key = UTF8ToString(key);
  const value = window.sessionStorage.getItem(js_key);
  return value ? stringToNewUTF8(value) : NULL;
});

int main() {
  // 写入会话数据
  save_session_data("user_login_token", "a1b2c3d4e5f6");
  
  // 读取会话数据
  const char* token = load_session_data("user_login_token");
  if (token) {
    printf("读取到的会话token:%s\n", token);
    // stringToNewUTF8返回的堆内存需要手动释放
    free((void*)token);
  } else {
    printf("无对应会话数据\n");
  }
  return 0;
}

编译命令

不需要额外链接库,直接执行即可:
emcc test.c -o test.html

方案2:使用Emscripten虚拟文件系统实现(适合大体积数据/需要文件操作的场景)

如果你的项目需要使用标准C/C++文件API(fopen/fwrite/fread等)操作数据,可以使用Emscripten提供的IDBFS文件系统,数据会持久化存储在浏览器IndexedDB中;如果需要纯会话级的文件存储,替换IDBFS为MEMFS即可,页面刷新/关闭后数据自动清除。

示例代码

#include <emscripten.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  // 挂载IDBFS持久化文件目录
  EM_ASM({
    FS.mkdir('/session_data');
    FS.mount(IDBFS, {}, '/session_data');
    // 先从IndexedDB同步历史数据到内存
    FS.syncfs(true, function(err) {
      if (err) console.error('数据同步失败:', err);
    });
  });

  // 写入会话数据到文件
  FILE* fp = fopen("/session_data/user.dat", "w");
  if (fp) {
    const char* session_info = "user_id:10086;login_time:1699999999";
    fwrite(session_info, 1, strlen(session_info), fp);
    fclose(fp);
    // 将内存中的改动同步到IndexedDB持久化
    emscripten_idbfs_sync(true, NULL, NULL);
    printf("会话数据写入完成\n");
  }

  // 读取会话数据
  fp = fopen("/session_data/user.dat", "r");
  if (fp) {
    char buf[1024] = {0};
    fread(buf, 1, 1023, fp);
    fclose(fp);
    printf("读取到的会话数据:%s\n", buf);
  }

  return 0;
}

编译命令

需要链接IDBFS库:
emcc test.c -o test.html -lidbfs.js

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:06:03