我想处理不同的 WebSocket 连接终止情况。如果通过注销或浏览器关闭在客户端终止,我应该发送电子邮件。如果它在服务器端终止(例如在服务器重新启动后),我应该什么都不做。
有没有办法检测以何种方式终止连接?
我使用 Rails 4.2 和 em-websocket gem。
我想处理不同的 WebSocket 连接终止情况。如果通过注销或浏览器关闭在客户端终止,我应该发送电子邮件。如果它在服务器端终止(例如在服务器重新启动后),我应该什么都不做。
有没有办法检测以何种方式终止连接?
我使用 Rails 4.2 和 em-websocket gem。
(按设计)不应该有一种方法来确定 websocket 连接关闭的原因,但是......
...可以将一些关闭事件编程到您的应用程序(客户端和服务器端)中,让您猜测其他原因。
此外,由于连接丢失(网络电缆拔出、Wi-Fi/蜂窝接收丢失、系统崩溃等),可能会发生 websocket 断开连接,这种情况通常会在较长时间后检测到 - 连接可能看起来是打开的(称为half-open
state ) 关闭时。
大多数服务器会在一分钟左右(很长)内检测到情况。在此处阅读更多相关信息。
对于服务器关闭,您可以利用Karnel.trap
方法。如果您使用的是Plezi,您可能可以利用on_shutdown
控制器中的回调,我很抱歉。
要使用该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 秒没有收到任何消息,您可以假设存在问题。
...
但:
completed
就个人而言,我会考虑在电子邮件等操作之前使用websocket 消息。我认为将事件“列入白名单”是一种更好的方法。