Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法让firebase实时数据库状态系统更快地检测断开连接_Firebase_Firebase Realtime Database_Flutter_Google Cloud Firestore - Fatal编程技术网

有没有办法让firebase实时数据库状态系统更快地检测断开连接

有没有办法让firebase实时数据库状态系统更快地检测断开连接,firebase,firebase-realtime-database,flutter,google-cloud-firestore,Firebase,Firebase Realtime Database,Flutter,Google Cloud Firestore,我正在创建一个flatter应用程序,必须几乎立即检测到用户从realtime/firestore数据库离线,并通知其他用户 我已经尝试了在实时数据库中订阅.info/connected并更新firestore数据库的推荐方法 FirebaseDatabase.instance .reference() .child(“.info”) .child(“已连接”) .onValue .listen((数据){ if(data.snapshot.value==false){ //互联网已经断开 设置

我正在创建一个flatter应用程序,必须几乎立即检测到用户从realtime/firestore数据库离线,并通知其他用户

我已经尝试了在实时数据库中订阅.info/connected并更新firestore数据库的推荐方法

FirebaseDatabase.instance
.reference()
.child(“.info”)
.child(“已连接”)
.onValue
.listen((数据){
if(data.snapshot.value==false){
//互联网已经断开
设置状态(){
state.connected=false;
});
userFirestoreRef.updateData({
“状态”:“脱机”,
“lastChanged”:FieldValue.serverTimestamp(),
});
}
userDbRef.onDisconnect().update({
“状态”:“脱机”,
“lastChanged”:ServerValue.timestamp
}).then(u)异步{
//这会在服务器收到请求时立即解决,而不是在用户断开连接时
设置状态(){
state.connected=true;
});
等待userDbRef.update({
“状态”:“联机”,
“lastChanged”:ServerValue.timestamp,
}).catchError((e)=>debugPrint('Error in realtime db auth,$e');
等待userFirestoreRef.updateData({
“状态”:“联机”,
“lastChanged”:FieldValue.serverTimestamp(),
}).catchError((e)=>debugPrint('firestore auth中的错误,$e');
});

一旦互联网关闭,实时数据库检测到用户断开连接大约需要1.5分钟,我希望这可能最多10秒。

客户端有两种断开连接的方法:

  • 一个干净的断开连接,客户端让服务器知道它正在消失

  • 脏断开连接,客户端消失,由服务器检测这种情况

对于干净的断开连接,您定义的
onDisconnect
写入将立即运行

脏断开连接取决于套接字超时,这意味着在您的
onDisconnect
写入发生之前可能需要几分钟。对于这种行为,您无能为力,因为它是套接字工作的固有部分


如果您想以更快的方式检测哪些客户端仍在连接,可以在数据库中写入keep alive(保持活动)。基本上是:每10秒从每个客户端写入一个sentinel值。

网络断开总是通过超时来实现的。网络包需要时间穿越网络,由对等方处理并发送响应背部;有时更大,有时更少。因为没有实际的电缆被“切断”,所以“断开”只有当对等方在某个时间段内没有响应时才能假设。为了在拥挤的网络和繁忙的对等方之间保持平衡,90秒是一个典型的超时值。您好,您如何能够在应用程序上记录用户的状态?许多人都说使用stream builder,但我认为这是不正确的。感谢您花费时间。这会是怎样的准确地工作?从每个客户端编写sentinel值您只需定期编写
ServerValue.TIMESTAMP