websocket - 连接中断时,Websocket 在丢失 pong 时不会关闭
问题描述
如果在 pingInterval 内没有收到 pong 消息,则应使用 WebSocketStatus.GOING_AWAY 关闭 Websocket。当连接丢失时,为什么这不起作用,例如使用未插入的电缆?这是预期的行为吗?如果是这样,ping 消息的意义何在?(我知道 TCP 超时的东西。)
复制:
- 使用低 pingInterval(例如 1ms),websocket 正确关闭 closeCode==1001
- 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
解决方案
推荐阅读
- apache-spark - 如何在 spark sql 中使用数据透视函数
- reactjs - 模拟点击反应中的第一个节点
- python - 是否可以在 x 轴(经度)上移动 geopandas 世界地图?
- oracle - 如何使用 Ref 游标作为 Visual Basic 的 Out-parameter 调用 Oracle 函数
- c# - 如何判断 Unity 构建过程中出了什么问题?
- windows - 用于浏览器的 Powershell 更改
- visual-studio-code - Windows vscode python extension install autopep8 failed: can't open file问题
- javascript - 如何循环遍历随机数并停在某个数字处?Javascript
- r - 如何使用基础 R 和 ggplot 绘制逻辑回归模型的结果
- html - 上标标签未按预期工作