基本上,我正在尝试检查我的WebSocket Server.ws的状态。但是,当我查询Server.ws.readyState时,我得到的唯一响应是WebSocket.OPEN。如果始终返回WebSocket.OPEN,如何检查WebSocket是否已断开连接
例如,我曾尝试关闭用于测试Flutter应用程序的设备的WiFi。通常,在一秒钟后,假定WebSocket断开连接,并使用WebSocketStatus.GOING_AWAY close代码关闭连接。我以为它也会改变WebSocket.readyState,但事实似乎并非如此。
那么,如何正确检查我的WebSocket的状态呢?
我现在如何检查:
/// Connection status
IconButton _status() {
IconData iconData;
switch (Server.ws?.readyState) {
case WebSocket.CONNECTING:
print("readyState : CONNECTING");
iconData = Icons.wifi;
break;
case WebSocket.OPEN:
print("readyState : OPEN");
iconData = Icons.signal_wifi_4_bar;
break;
case WebSocket.CLOSING:
print("readyState : CLOSING");
iconData = Icons.signal_wifi_4_bar_lock;
break;
case WebSocket.CLOSED:
print("readyState : CLOSED");
iconData = Icons.warning;
break;
default:
print("readyState : " + Server.ws.readyState.toString());
break;
}
return new IconButton(
icon: new Icon(iconData),
tooltip: 'Connection Status', // TODO:Localize
onPressed: () {
setState(() {
Server.ws.close();
});
},
);
}有关WebSocket的其他信息:
/// Should be called when the IP is validated
void startSocket() {
try {
WebSocket.connect(Server.qr).then((socket) {
// Build WebSocket
Server.ws = socket;
Server.ws.listen(
handleData,
onError: handleError,
onDone: handleDone,
cancelOnError: true,
);
Server.ws.pingInterval = new Duration(
seconds: Globals.map["PingInterval"],
);
send(
"CONNECTION",
{
"deviceID": Globals.map["UUID"],
},
);
});
} catch (e) {
print("Error opening a WebSocket : $e");
}
}
/// Handles the closing of the connection.
void handleDone() {
print("WebSocket closed.");
new Timer(new Duration(seconds: Globals.map["PingInterval"]), startSocket);
}
/// Handles the WebSocket's errors.
void handleError(Error e) {
print("WebSocket error.");
print(e);
Server.ws.close();
}发布于 2018-04-13 05:50:37
我已经继续查看了WebSocket实现的源代码。在状态为GOING_AWAY的情况下关闭WebSocket时,内部套接字流似乎正在关闭。但是,此事件可能不会传播到处理实例的readyState的转换流。我建议在dartbug.com上提交一份错误报告。
https://stackoverflow.com/questions/49777801
复制相似问题