首页 > 解决方案 > 连接中断时,Websocket 在丢失 pong 时不会关闭

问题描述

如果在 pingInterval 内没有收到 pong 消息,则应使用 WebSocketStatus.GOING_AWAY 关闭 Websocket。当连接丢失时,为什么这不起作用,例如使用未插入的电缆?这是预期的行为吗?如果是这样,ping 消息的意义何在?(我知道 TCP 超时的东西。)

复制:

  1. 使用低 pingInterval(例如 1ms),websocket 正确关闭 closeCode==1001
  2. pingInterval 高(如 1000ms),过一会终止连接,websocket 不会关闭(closeCode 为空)

这是重现的代码:

import 'dart:async';

import 'package:web_socket_channel/io.dart';

void main() {
  final channel = IOWebSocketChannel.connect("ws://echo.websocket.org/",
      pingInterval: Duration(milliseconds: 1000));
  channel.stream.listen(print, onError: print, onDone: () => print('done'));
  Timer.periodic(Duration(seconds: 3), (t) {
    int time = DateTime.now().millisecondsSinceEpoch;
    channel.sink.add("message: hi, $time");
  });
  Timer.periodic(Duration(seconds: 10), (t) {
    print("closeCode: ${channel.closeCode}");
  });
}

和控制台输出:

message: hi, 1562579165221
message: hi, 1562579168221
message: hi, 1562579171221
closeCode: null
message: hi, 1562579174221
message: hi, 1562579177221
message: hi, 1562579180221
closeCode: null    <---- cable pulled
closeCode: null
closeCode: null

标签: websocketdart

解决方案


推荐阅读