Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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
Javascript 从浏览器发送websocket ping/pong帧_Javascript_Websocket_Mongrel2 - Fatal编程技术网

Javascript 从浏览器发送websocket ping/pong帧

Javascript 从浏览器发送websocket ping/pong帧,javascript,websocket,mongrel2,Javascript,Websocket,Mongrel2,我一直在WebSocket中阅读关于乒乓球的消息,以保持连接,但我不确定它们是什么。它是一种独特的框架类型吗?(我在chrome中没有看到与乒乓球相关的javascript WebSocket对象上的任何方法)。或者它只是一种设计模式(例如,我直接向服务器发送“ping”或任何其他字符串,并让它响应)。乒乓球和连续帧有关系吗 我问这个问题的原因是我正在使用一个运行在Mongrel2后面的python框架,所以我想知道是否有一种方法可以向Mongrel2发送一条特定的ping/pong消息,告诉它

我一直在WebSocket中阅读关于乒乓球的消息,以保持连接,但我不确定它们是什么。它是一种独特的框架类型吗?(我在chrome中没有看到与乒乓球相关的javascript WebSocket对象上的任何方法)。或者它只是一种设计模式(例如,我直接向服务器发送“ping”或任何其他字符串,并让它响应)。乒乓球和连续帧有关系吗

我问这个问题的原因是我正在使用一个运行在Mongrel2后面的python框架,所以我想知道是否有一种方法可以向Mongrel2发送一条特定的ping/pong消息,告诉它保持连接,而我的python应用程序不必担心它。我想这类似于一个单独的HTTP方法。我想象一个专用的ping/pong消息框架可能比字符串“ping”更简单(服务器和网络上的负载更少),尽管这可能不会太重要


编辑:我刚才看了一下,乒乓球和乒乓球看起来绝对是控制帧类型,有自己的操作码。那么,如何从Chrome中的javascript发送Ping帧呢?

没有javascript API来发送Ping帧或接收pong帧。您的浏览器是否支持此功能。也没有API来启用、配置或检测浏览器是否支持并正在使用乒乓帧。这是有原因的。将来ping可能是可配置/可检测的,但Javascript不太可能直接发送和接收ping/pong帧


但是,如果同时控制客户端和服务器代码,则可以轻松地在更高级别上添加乒乓球支持。如果您还没有消息类型头/元数据,那么您需要在消息中包含此类头/元数据,但这非常简单。除非您计划每秒发送Ping数百次或同时发送数千个客户端,否则您自己执行Ping的开销将非常小。

Ping意味着只从服务器发送到客户端,浏览器应尽快自动使用Pong操作码进行应答。所以你不必在更高层次上担心这个问题

虽然并非所有浏览器都像他们想象的那样支持标准,但它们在实现这种机制方面可能存在一些差异,甚至可能意味着没有Pong响应功能。但就我个人而言,我正在使用Ping/Pong,从未见过不在低级别客户端实现上实现此类操作码和自动响应的客户端。

js中可能的解决方案 如果WebSocket服务器主动在几分钟后断开
ws
链接,则服务器和客户端之间不会发送任何消息

  • 客户端主动发送一条定制的
    ping
    消息,通过使用
    keepAlive
    函数保持活动状态

  • 服务器端将忽略自定义
    ping
    消息,并响应自定义
    pong
    消息

  • 让timerId=0;
    函数keepAlive(超时=20000){
    如果(webSocket.readyState==webSocket.OPEN){
    webSocket.send(“”);
    }  
    timerId=setTimeout(keepAlive,timeout);
    }
    函数cancelKeepAlive(){
    if(timerId){
    清除超时(timerId);
    }  
    }
    
    只需从服务器ping。每个人都知道非标准端口上的网络问题,所以他们开始定期短时间ping。我想你可以ping一个写得不好的服务器,但用它们做任何敏感的事情可能不太聪明。@user1382306首先从服务器ping将使用移动设备电池使用速度非常快。从客户端Ping可以节省设备电池。@user1382306不是所有人!非标准端口上的网络问题是什么?您从哪里了解到ping仅从服务器到客户端?RFC表示“在建立连接后和关闭连接之前,端点可以随时发送Ping帧。”如果您希望客户端自动检测到断开连接的状态(当没有收到RST/FIN数据包,但网络已断开连接时),然后,您还需要让客户端启动ping数据包。当未收到RST/FIN数据包时,TCP不会通知断开连接。TCP仅在发送方尝试在断开的连接上发送时检测断开的连接。ping在许多应用程序中被用作心跳,这是一种有效的用法。在客户端尝试发送之前,死连接将永远保持死连接。因此,对于浏览器上的WebSocket,必须使用自定义ping(或heartbeat)消息来检测客户端上的客户端断开连接。服务器可能正在尝试ping,并检测到客户端断开连接,但未通知客户端。客户端Ping也很好。在WebSocket协议RFC 6455中,它明确指出:“注意:Ping帧可以用作keepalive,也可以用作验证远程端点是否仍有响应的手段。”当用户代理经常刷新时,建议使用仅服务器Ping。但是现在很多网站都被设计成SPA。在这种环境下,客户端应用程序定期ping服务器以确保连接未丢失可能非常重要。@bigmugcup链接已断开此代码发送空帧,而不是ping或pong帧。@请记住,请先阅读我的说明,我知道发生了什么。仍然是一个不正确的答案,尽管这让我看到了一个保持活动的功能,在我的例子中,它是通知服务器更新websocket连接上的读取截止日期值(顺便说一句,我在golang服务器中)。虽然我不得不通过模拟它来发送一个乒乓球字符串来让它更有意义。非常感谢。来自坦桑尼亚。@DoctorWindrol博士