我正在尝试使用基于赛璐珞(gem 'celluloid-websocket-client')的Celluloid和Websocket客户端连接到远程websocket。这个客户端的主要优点是我可以使用类方法而不是块来回调。
require 'celluloid/websocket/client'
class WSConnection
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"
end
# When raw WebSocket message is received
def on_message(msg)
puts "Received message: #{msg}"
end
# When WebSocket is closed
def on_close(code, reason)
puts "WebSocket connection closed: #{code.inspect}, #{reason.inspect}"
end
end
m = WSConnection.new('wss://foo.bar')
while true; sleep; end
预期输出
"Websocket connection opened"
但是,我根本没有得到任何输出。可能是什么问题?
我正在使用
gem 'celluloid-websocket-client', '0.0.2'
rails 4.2.1
ruby 2.1.3
答案 0 :(得分:4)
正如您在评论中注意到的那样,gem没有SSL
支持。那是麻烦。为了解释答案,这是一个决议,以及对未来期望的一些后续步骤:
Celluloid::WebSocket::Client::Connection
这是为当前gem提供SSL
支持的示例注入。 Mine实际上经过了高度修改,但这显示了基本的解决方案:
def initialize(url, handler=nil)
@url = url
@handler = handler || Celluloid::Actor.current
#de If you want an auto-start:
start
end
def start
uri = URI.parse(@url)
port = uri.port || (uri.scheme == "ws" ? 80 : 443)
@socket.close rescue nil
@socket = Celluloid::IO::TCPSocket.new(uri.host, port)
@socket = Celluloid::IO::SSLSocket.new(@socket) if port == 443
@socket.connect
@client = ::WebSocket::Driver.client(self)
async.run
end
上面通过其他方法发送了涟漪效应,但是,例如,@handler
用于保存调用actor,该actor也有发射器方法。就像我说的那样,我的版本与股票宝石非常不同,因为我厌倦了它并重新加工了我的版本。但那时:
Reel::IO::Client
并避免接近某些脑损伤。有WebSocket
支持令人兴奋的事情,并且gem正在重构websockets的服务器和客户端实现。不再需要monkeypatches!
所有websocket功能都是从Reel
中提取出来的,并与websocket-driver
抽象相结合,Reel::IO
...同时包含::Server
和::Client
个品种
有趣的是,这是由Rails
提示的,它正在从EventMachine
转移到Celluloid::IO
以获取网址:
prealpha在线预览:https://github.com/celluloid/reel-io