检测WebSocket连接是否在服务器端终止

时间:2015-11-13 11:50:21

标签: ruby-on-rails websocket em-websocket

我想处理不同的WebSocket连接终止案例。如果通过注销或浏览器关闭在客户端终止,我应该发送电子邮件。如果它在服务器端终止(例如在服务器重启后),我就什么都不做。

有没有办法检测连接以什么方式终止?

我使用Rails 4.2和em-websocket gem。

1 个答案:

答案 0 :(得分:1)

不应该(按设计)是确定websocket连接关闭原因的方法,但是 ......

...可以将某些关闭事件编入您的应用程序(客户端和服务器端),以便您猜出其他原因。

此外,由于连接断开(网络电缆未插入,Wi-Fi /蜂窝接收丢失,系统崩溃等等),可能会发生websocket断开连接,这种情况通常会在较长时间后检测到 - 连接看起来很糟糕在关闭时打开(称为half-open state)。

大多数服务器会在最多一分钟左右(长时间)检测到这种情况。阅读更多相关信息here

对于服务器关闭,您可以利用Karnel.trap method。如果您使用的是Plezi,那么您可能可以利用控制器中的on_shutdown(我有偏见,因为我是作者)...来自您的评论我已经了解到em-websockets没有类似的回调,我很抱歉。

要使用trap方法,您可以捕获退出信号并在转发之前执行任何必要的操作。即(它不是很干,你可以改进这个概念):

old_int_trap = trap('INT') do
   puts "do something"
   old_int_trap.respond_to?(:call) && old_int_trap.call
end
old_term_trap = trap('TERM') do
   puts "do something"
   old_term_trap.respond_to?(:call) && old_term_trap.call
end

或者,如果服务器因其自身原因(身份验证,不当行为等)关闭连接,您可以轻松设置一个标记,告诉on_closeonclose ?)回调什么都不做。

客户端注销很简单 - 在将用户注销之前发送消息。

浏览器关闭可以是默认设置(没有其他原因可以关闭)。

断开连接很困难,但你可以保留一个变量来存储上一次websocket消息的时间,如果自上一条消息以来没有收到超过30秒的消息,你可以假设一个问题。

...

<强> BUT:

就个人而言,我会考虑在诸如电子邮件等行为之前使用completed websocket消息。我认为&#34;白名单&#34;事件是一种更好的方法。