我一直在使用网络套接字进行测试,并且想使用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] 删除。
我来说两句