Dart如何实际使用websocket pingInterval?

内特·洛克伍德

我一直在使用网络套接字进行测试,并且想使用pingInterval来确定客户端是否关闭,但是我无法检测到。我每4秒钟通过websocket发送一条消息。我认为,当我退出浏览器时,不会生成任何错误情况,并且我无法弄清如何检测Web套接字是否关闭了连接。我该如何检测?我也是Dart和Web应用程序的新手。

年份

我使用SDK 1.5.0.dev进行了测试:

服务器代码:

import 'dart:io';
main() {
  HttpServer.bind('127.0.0.1', 4040).then((server) {
    server.listen((HttpRequest request) {
      WebSocketTransformer.upgrade(request).then((socket) {
        socket.listen((msg){
          socket.pingInterval = new Duration(seconds : 1);
          print('server received message: $msg');
          socket.add('server received message: $msg');
        });
        socket.done.then((e){
            print("WebSocket closed with:"
                  "socket.closeReason: ${socket.closeReason}, "
                  "socket.closeCode: ${socket.closeCode}");
          });
      });
    });
  });
}

客户代码:

import 'dart:html';
import 'dart:async';
void main() {
  querySelector('button').onClick.first.then((e){
    for (int i = 0; i > -1; i++){
      print("epic code");
    }
  });
  WebSocket ws = new WebSocket('ws://127.0.0.1:4040');
  ws.onMessage.listen((MessageEvent e) {
    querySelector('#response').appendHtml('<p>${e.data}</p>');
  });
  Timer t = new Timer.periodic(new Duration(seconds : 1), (t) {
    ws.sendString('timer fired');
  });
}

的HTML:

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <title>ClientTest</title>
    <link rel="stylesheet" href="clienttest.css">
  </head>
  <body>
    <button type="button">Hang</button>
    <p>Response:</p>

    <div id="response">
    </div>

    <script type="application/dart" src="clienttest.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>

例如,如果关闭浏览器窗口,则客户端服务器将关闭套接字socket.closeReason: , socket.closeCode: 1005,当然,如果不是“突然死亡”,CloseEvent代码也可以提供您自己的原因。

但是,如果您设置pingInterval并按下Hang按钮,则服务器将在超时时关闭套接字,但带有socket.closeReason: null, socket.closeCode: null没有pingInterval它,将继续等待。

可能,Dart团队应该提供比更为“详尽”的内容null但是您可以使用Stream超时自己ping它

Stream timeout(Duration timeLimit, {Function void onTimeout(EventSink sink)})

创建一个具有与此流相同事件的新流。

每当来自此流的两个事件之间传递的时间超过timeLimit时,将调用onTimeout函数。

在收听返回的流之前,不会开始倒计时。每次从此流转发事件时,或者在暂停和恢复该流时,都会重置倒计时。

使用一个参数调用onTimeout函数:EventSink,它允许将事件放入返回的流中。此EventSink仅在对onTimeout的调用期间有效。

如果省略onTimeout,则超时只会将TimeoutException放入返回的流的错误通道中。

返回的流不是广播流,即使该流也是如此。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何实际使用 AddressSanitizer 和 MemorySanitizer?

来自分类Dev

foldl的实际使用

来自分类Dev

如何实际使用has_many:through并建立关系

来自分类Dev

如何找出浏览器实际使用的网站图标

来自分类Dev

如何实际使用skimage保存图像(Python)

来自分类Dev

如何确定实际使用的日志配置源Logback?

来自分类Dev

如何在并发环境中实际使用Git

来自分类Dev

如何实际使用assimp获取骨骼和动画数据?

来自分类Dev

如何实际使用上下文?

来自分类Dev

如何在Python中实际使用NotImplementedError?

来自分类Dev

如何计算函数调用实际使用的返回值?

来自分类Dev

如何在并发环境中实际使用Git

来自分类Dev

如何实际使用has_many:through并建立关系

来自分类Dev

如何强制单行布局实际使用单行?

来自分类Dev

Swift NSLocalizedString实际使用

来自分类Dev

PHP实际使用多少内存?

来自分类Dev

在领域中实际使用@Ignore吗?

来自分类Dev

Jade模板和angularjs的实际使用

来自分类Dev

python实际使用哪种GC算法?

来自分类Dev

Django:确定实际使用的pip包

来自分类Dev

4D +阵列的实际使用

来自分类Dev

实际使用域是否安全?

来自分类Dev

确定数组实际使用的大小

来自分类Dev

实际使用TCP_DEFER_ACCEPT?

来自分类Dev

实际使用展开的跳过列表

来自分类Dev

Hadoop在项目中的实际使用

来自分类Dev

检查实际使用的glibc版本

来自分类Dev

如何在不实际使用<form>的情况下使用引导表单布局?

来自分类Dev

如何使用Epplus获取修改后的Excel的实际使用范围?