Dart websocket pingInterval实际上是如何使用的?
我一直在使用web套接字进行测试,希望使用pingInterval来确定客户端是否已关闭,但我无法检测到。我每4秒钟通过websocket发送一条消息。我想,当我退出浏览器时,不会产生任何错误条件,而且我还不知道如何检测web套接字是否关闭了连接。我怎么能发现呢?我还不熟悉Dart和web应用程序。我用SDK 1.5.0.dev测试了它: 服务器代码:Dart websocket pingInterval实际上是如何使用的?,websocket,dart,Websocket,Dart,我一直在使用web套接字进行测试,希望使用pingInterval来确定客户端是否已关闭,但我无法检测到。我每4秒钟通过websocket发送一条消息。我想,当我退出浏览器时,不会产生任何错误条件,而且我还不知道如何检测web套接字是否关闭了连接。我怎么能发现呢?我还不熟悉Dart和web应用程序。我用SDK 1.5.0.dev测试了它: 服务器代码: 导入'dart:io'; main(){ 绑定('127.0.0.1',4040)。然后((服务器){ 侦听((HttpRequest请求){
导入'dart:io';
main(){
绑定('127.0.0.1',4040)。然后((服务器){
侦听((HttpRequest请求){
WebSocketTransformer.upgrade(请求)。然后((套接字){
socket.listen((msg){
socket.pingInterval=新的持续时间(秒:1);
打印('server received message:$msg');
add('server received message:$msg');
});
socket.done.then((e){
打印(“WebSocket关闭时使用:”
socket.closeReason:${socket.closeReason}
“socket.closeCode:${socket.closeCode}”);
});
});
});
});
}
客户端代码:
导入'dart:html';
导入“dart:async”;
void main(){
querySelector('button')。onClick.first.then((e){
对于(int i=0;i>-1;i++){
打印(“epic代码”);
}
});
WebSocket ws=newWebSocket('ws://127.0.0.1:4040');
listen((MessageEvent e){
querySelector(“#response”).appendHtml(“${e.data}”);
});
定时器t=新定时器。周期性(新持续时间(秒:1),(t){
ws.sendString('timer-fired');
});
}
html:
客户测试
悬挂
答复:
例如,如果您关闭浏览器窗口,则客户端服务器将使用socket.closeReason:,socket.closeCode:1005关闭套接字。当然,如果不是“猝死”,您可以提供自己的原因
但如果您设置pingInterval
并按下Hang
按钮,则服务器将在超时时关闭套接字,但会使用socket.closeReason:null,socket.closeCode:null
。没有pingInterval
它将继续等待
也许,Dart团队应该提供比null
更“详尽”的东西。但你可以自己动手
流超时(持续时间限制,{Function void onTimeout(EventSink sink)})
创建与此流具有相同事件的新流
当两个事件之间的时间限制超过此时间限制时
流,则调用onTimeout函数
在监听返回的流之前,倒计时不会开始。
每次从该服务器转发事件时,都会重置倒计时
流,或当流暂停并恢复时
使用一个参数调用onTimeout函数:一个
允许将事件放入返回的流中。此事件接收器仅适用于
在调用onTimeout期间有效
如果省略onTimeout,则超时将只放置TimeoutException
进入返回流的错误通道
返回的流不是广播流,即使该流是广播流
因为我在这方面是新手,所以我花了一点时间来修改代码以更好地理解它,并且花了很多、很多、更少的时间在代码中实现和测试它。我注意到socket.closeReason返回null,代码为1005,当我在IOS(iPad)中迁移到safari中的新选项卡时,不会返回close或任何其他内容,这正是我想要的。好极了