【发布时间】:2019-08-25 10:48:51
【问题描述】:
我正在努力如何在颤振中实现 websockets 自动重新连接。我使用web_socket_channel,但是,该插件只是包装dart.io WebSocket,因此任何基于WebSocket 类的解决方案也适用于我。
我已经想通了,如何捕捉socket断开,看下面的sn-p代码:
try {
_channel = IOWebSocketChannel.connect(
wsUrl,
);
///
/// Start listening to new notifications / messages
///
_channel.stream.listen(
_onMessageFromServer,
onDone: () {
debugPrint('ws channel closed');
},
onError: (error) {
debugPrint('ws error $error');
},
);
} catch (e) {
///
/// General error handling
/// TODO handle connection failure
///
debugPrint('Connection exception $e');
}
我想从onDone 内部调用IOWebSocketChannel.connect,但是,这会导致一种无限循环 - 因为我必须在再次调用connect 之前关闭_channel,这轮到它调用@ 987654330@再次等等。
任何帮助将不胜感激!
【问题讨论】:
-
我正在使用 socket.io 并且重新连接由插件自动处理。有什么理由必须使用websocket?
-
socket.io与websocket相比开销太大。不过,我正在考虑将socket.io作为备用计划。您正在使用哪个特定的socket.io包? -
adhara_socket_io
-
我创建了另一个线程来运行一个计时器,该计时器每 10 秒向服务器发送一次心跳。这个定时器函数也有一个 print('HB');陈述。即使在应用程序在后台并且屏幕关闭后,计时器也可以 24/7 运行(即控制台看到不间断的 'HB' 24/7),但是,在屏幕关闭后大约 10 分钟停止发送心跳。 websocket能在这种情况下生存吗?
-
那么毕竟你创建了一个hb来让socket保持活跃?根据我在 javascript 客户端(浏览器和移动 webview)中使用 socket.io 的经验,我不必创建类似的东西 - socket.io 会自行处理。我很惊讶地理解在颤振中并非如此。我相信您描述的上述方法也应该适用于 websocket。一段时间后,重新 HB 在后台模式下停止 - 这是由于 OS 电池优化模式,您几乎无法克服它。唯一可行的解决方案是在您的应用返回前台模式后重新连接。