Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart websocket pingInterval实际上是如何使用的?_Websocket_Dart - Fatal编程技术网

Dart websocket pingInterval实际上是如何使用的?

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请求){

我一直在使用web套接字进行测试,希望使用pingInterval来确定客户端是否已关闭,但我无法检测到。我每4秒钟通过websocket发送一条消息。我想,当我退出浏览器时,不会产生任何错误条件,而且我还不知道如何检测web套接字是否关闭了连接。我怎么能发现呢?我还不熟悉Dart和web应用程序。

我用SDK 1.5.0.dev测试了它:

服务器代码:

导入'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或任何其他内容,这正是我想要的。好极了