首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dart - WebSocket.readyState始终返回WebSocket.OPEN

Dart - WebSocket.readyState始终返回WebSocket.OPEN
EN

Stack Overflow用户
提问于 2018-04-11 22:30:45
回答 1查看 1.1K关注 0票数 0

基本上,我正在尝试检查我的WebSocket Server.ws的状态。但是,当我查询Server.ws.readyState时,我得到的唯一响应是WebSocket.OPEN。如果始终返回WebSocket.OPEN,如何检查WebSocket是否已断开连接

例如,我曾尝试关闭用于测试Flutter应用程序的设备的WiFi。通常,在一秒钟后,假定WebSocket断开连接,并使用WebSocketStatus.GOING_AWAY close代码关闭连接。我以为它也会改变WebSocket.readyState,但事实似乎并非如此。

那么,如何正确检查我的WebSocket的状态呢?

我现在如何检查:

代码语言:javascript
复制
/// 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的其他信息:

代码语言:javascript
复制
/// 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();
}
EN

回答 1

Stack Overflow用户

发布于 2018-04-13 05:50:37

我已经继续查看了WebSocket实现的源代码。在状态为GOING_AWAY的情况下关闭WebSocket时,内部套接字流似乎正在关闭。但是,此事件可能不会传播到处理实例的readyState的转换流。我建议在dartbug.com上提交一份错误报告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49777801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档