如何在C++中访问及存取emscripten的会话数据
Emscripten 会话数据存储/读取方案及示例
可用搜索关键词
你可以使用以下关键词搜索相关资料:
emscripten session storageemscripten localstorageemscripten persistent storageemscripten 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
相关产品推荐
相关产品推荐

