Flutter流式读取MySQL数据库:Firebase与Socket.io选型及实现
实时数据库持续读取方案解析
一、Firebase Realtime Database 能否实现无重复API调用的持续读取?
可以。Firebase Realtime Database 本身基于WebSocket长连接实现了实时数据同步能力,无需反复调用API。通过其SDK提供的监听方法(如on('value')、on('child_added')、on('child_changed')),客户端可以订阅指定数据节点,当节点数据发生变化时,Firebase会主动将更新推送给客户端,全程无需手动发起重复请求。
二、Firebase Realtime Database vs Socket.io:差异与选型建议
核心差异
- 定位与集成复杂度
- Firebase Realtime Database:是完整的后端即服务(BaaS),自带数据库、身份认证、云存储等全套功能,实时监听是内置特性,无需自行搭建服务器,开箱即用。
- Socket.io:是一个实时通信库,仅提供双向通信能力,需要你自行搭建后端服务器(如Node.js),并配合数据库(如MongoDB、MySQL)使用,需自己维护服务器和数据同步逻辑。
- 数据同步能力
- Firebase:自动处理连接状态管理、断连重连、离线缓存、数据冲突解决等细节,针对数据库同步做了深度优化。
- Socket.io:仅提供通信通道,数据同步逻辑(如数据库变更监听、数据推送规则、冲突处理)需要你自行编码实现。
- 使用场景适配
- Firebase:适合快速开发、无后端维护能力或仅需基础实时数据同步的场景(如聊天、实时仪表盘)。
- Socket.io:适合已有自建后端架构、需要自定义实时通信逻辑(如除数据库同步外还有自定义业务事件推送)的场景。
- 成本模型
- Firebase:提供免费额度,超出后按数据存储量、带宽、请求量等计费。
- Socket.io:需自行承担服务器(云服务器/VPS)的租赁成本,数据库成本单独计算。
选型建议
如果没有现有后端服务,且仅需实现数据库的实时读取,Firebase Realtime Database是更省心的选择,无需额外开发后端逻辑;如果已有自建后端,或需要高度自定义实时通信规则,Socket.io更适合,能灵活适配你的业务架构。
三、Socket.io 连接服务器与实时读取数据库实现示例
以下是基于Node.js后端(Express+Socket.io+MongoDB)和浏览器客户端的实现示例:
1. 服务器端代码(Node.js)
首先安装依赖:
npm install express socket.io mongoose
const express = require('express'); const http = require('http'); const { Server } = require('socket.io'); const mongoose = require('mongoose'); // 连接MongoDB数据库 mongoose.connect('mongodb://localhost:27017/realtimeDB') .then(() => console.log('数据库连接成功')) .catch(err => console.error('数据库连接失败:', err)); // 定义数据模型 const DataSchema = new mongoose.Schema({ content: String, updatedAt: { type: Date, default: Date.now } }); const DataModel = mongoose.model('Data', DataSchema); // 创建Express和Socket.io实例 const app = express(); const server = http.createServer(app); const io = new Server(server, { cors: { origin: "http://localhost:8080", // 允许客户端域名 methods: ["GET", "POST"] } }); // 监听客户端连接 io.on('connection', (socket) => { console.log('客户端已连接:', socket.id); // 初始加载数据并推送给客户端 DataModel.findOne().sort({ updatedAt: -1 }) .then(data => { if (data) socket.emit('dataUpdate', data); }); // 监听数据库变更(这里用mongoose的watch方法监听集合变化) const changeStream = DataModel.watch(); changeStream.on('change', (change) => { // 当数据更新时,拉取最新数据推送给所有连接的客户端 if (change.operationType === 'update' || change.operationType === 'insert') { DataModel.findOne().sort({ updatedAt: -1 }) .then(data => { io.emit('dataUpdate', data); }); } }); // 监听客户端断开连接 socket.on('disconnect', () => { console.log('客户端已断开:', socket.id); changeStream.close(); // 关闭变更监听 }); }); // 启动服务器 server.listen(3000, () => { console.log('服务器运行在 http://localhost:3000'); });
2. 客户端代码(浏览器)
<!DOCTYPE html> <html> <head> <title>Socket.io 实时读取示例</title> <script src="https://cdn.socket.io/4.7.2/socket.io.min.js"></script> </head> <body> <h1>实时数据展示</h1> <div id="dataContainer"></div> <script> // 连接服务器 const socket = io('http://localhost:3000'); // 接收服务器推送的更新数据 socket.on('dataUpdate', (data) => { const container = document.getElementById('dataContainer'); container.innerHTML = ` <p>最新内容: ${data.content}</p> <p>更新时间: ${new Date(data.updatedAt).toLocaleString()}</p> `; }); // 监听连接状态 socket.on('connect', () => { console.log('已连接到服务器'); }); socket.on('disconnect', () => { console.log('与服务器断开连接'); }); </script> </body> </html>
运行说明:
- 启动MongoDB服务,确保端口为27017
- 运行服务器端代码:
node server.js - 在浏览器中打开客户端HTML文件(可放在本地服务器如http://localhost:8080)
- 当MongoDB的
datas集合中数据更新时,客户端会自动收到最新数据
内容的提问来源于stack exchange,提问作者Santosh Kumar
相关产品推荐
相关产品推荐

