0

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

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

我使用 Rails 4.2 和 em-websocket gem。

4

1 回答 1

1

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

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

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

大多数服务器会在一分钟左右(很长)内检测到情况。在此处阅读更多相关信息。

对于服务器关闭,您可以利用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 消息。我认为将事件“列入白名单”是一种更好的方法。

于 2015-11-13T21:15:31.170 回答