Веб-сокет не закрывается при отсутствии связи, когда соединение прерывается - PullRequest
1 голос
/ 08 июля 2019

Веб-сокеты должны быть закрыты с помощью WebSocketStatus.GOING_AWAY, если сообщение pong не получено в пределах pingInterval.Почему это не работает, если связь потеряна, например, при отключенном кабеле?Это ожидаемое поведение?И если да, то какой смысл пинговать сообщения?(Я знаю о тайм-ауте TCP.)

Воспроизвести:

  1. При низком значении pingInterval (например, 1 мс) веб-сокет корректно закрывается с помощью closeCode == 1001
  2. При высоком значении pingInterval (например, 1000 мс), через некоторое время отключите подключение, веб-сокет не закроется (closeCode имеет значение null)

Вот код для воспроизведения:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...