我想处理不同的WebSocket连接终止案例。如果通过注销或浏览器关闭在客户端终止,我应该发送电子邮件。如果它在服务器端终止(例如在服务器重启后),我就什么都不做。
有没有办法检测连接以什么方式终止?
我使用Rails 4.2和em-websocket gem。
答案 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_close
(onclose
?)回调什么都不做。
客户端注销很简单 - 在将用户注销之前发送消息。
浏览器关闭可以是默认设置(没有其他原因可以关闭)。
断开连接很困难,但你可以保留一个变量来存储上一次websocket消息的时间,如果自上一条消息以来没有收到超过30秒的消息,你可以假设一个问题。
...
<强> BUT:强>
就个人而言,我会考虑在诸如电子邮件等行为之前使用completed
websocket消息。我认为&#34;白名单&#34;事件是一种更好的方法。