gpt4 book ai didi

ruby - 优雅地断开与 Celluloid 的 WebSocket 连接

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:26 26 4
gpt4 key购买 nike

情况

我使用 Chrome 的 Remote Debugging Protocol 连接到 WebSocket ,使用 Rails 应用程序和实现 Celluloid 的类,或者更具体地说,celluloid-websocket-client .

问题是我不知道如何彻底断开 WebSocket 的连接。

当 actor 内部发生错误,但主程序运行时,Chrome 仍然以某种方式使 WebSocket 不可用,不允许我再次附加。

代码示例

这是完全独立的代码:

require 'celluloid/websocket/client'

class MeasurementConnection

include Celluloid

def initialize(url)
@ws_client = Celluloid::WebSocket::Client.new url, Celluloid::Actor.current
end

# When WebSocket is opened, register callbacks
def on_open
puts "Websocket connection opened"
# @ws_client.close to close it
end

# When raw WebSocket message is received
def on_message(msg)
puts "Received message: #{msg}"
end

# Send a raw WebSocket message
def send_chrome_message(msg)
@ws_client.text JSON.dump msg
end

# When WebSocket is closed
def on_close(code, reason)
puts "WebSocket connection closed: #{code.inspect}, #{reason.inspect}"
end

end

MeasurementConnection.new ARGV[0].strip.gsub("\"","")
while true
sleep
end

我尝试过的

  • 当我取消注释 @ws_client.close 时,我得到:

    NoMethodError: undefined method `close' for #<Celluloid::CellProxy(Celluloid::WebSocket::Client::Connection:0x3f954f44edf4)

    但我想this was delegated ?至少 .text 方法也有效?

  • 当我改为调用 terminate(以退出 Actor)时,WebSocket 仍在后台打开。

  • 当我在主代码中创建的 MeasurementConnection 对象上调用 terminate 时,它使 Actor 看起来死了,但仍然没有释放连接.

如何重现

您可以通过使用 --remote-debugging-port=9222 作为命令行参数启动 Chrome 来自行测试,然后检查 curl http://localhost:9222/json 并从那里使用 webSocketDebuggerUrl,例如:

ruby chrome-test.rb $(curl http://localhost:9222/json 2>/dev/null | grep webSocket | cut -d ":" -f2-)

如果没有可用的 webSocketDebuggerUrl,则说明仍然有东西连接到它。

它曾经在我使用类似于 this exampleEventMachine 时起作用,但不是 faye/websocket-client,而是 em-websocket-client反而。在这里,在停止 EM 循环(使用 EM.stop)后,WebSocket 将再次可用。

最佳答案

我想通了。我使用了 0.0.1 版本的 celluloid-websocket-client gem,它没有委托(delegate) close 方法。

使用 0.0.2 有效,代码如下所示:

MeasurementConnection中:

def close
@ws_client.close
end

在主要代码中:

m = MeasurementConnection.new ARGV[0].strip.gsub("\"","")
m.close
while m.alive?
m.terminate
sleep(0.01)
end

关于ruby - 优雅地断开与 Celluloid 的 WebSocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com