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



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

有没有一种方法可以检测连接以何种方式终止?

我使用Rails 4.2和em websocket gem。

(按设计)不应该有一种方法来确定websocket连接关闭的原因,。。。

可以将一些关闭事件编程到应用程序中(客户端和服务器端),从而猜测其他原因。

此外,网络套接字断开连接可能是由于连接丢失(网络电缆拔出、Wi-Fi/蜂窝接收丢失、系统崩溃等)而发生的,这种情况通常会在较长时间后检测到——连接在关闭时可能看起来是打开的(称为half-open状态)。

大多数服务器会在一分钟左右的时间内检测到这种情况(这很长)。点击此处了解更多信息。

对于服务器关闭,您可以利用Karnel.trap方法。如果你使用Plezi,你可能可以在控制器中使用on_shutdown(我有偏见,因为我是作者)。。。从你的评论中,我了解到em websockets没有类似的回调,对此我感到抱歉。

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

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秒没有收到消息,您就可以假设出现了问题。

但是:

就我个人而言,我会考虑在诸如电子邮件等操作之前使用completed websocket消息。我认为"白名单"活动是一个更好的方法。

相关内容

  • 没有找到相关文章

最新更新