Ruby:连接到远程WebSocket

时间:2015-05-21 12:37:40

标签: ruby websocket celluloid

我正在尝试使用基于赛璐珞(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

1 个答案:

答案 0 :(得分:4)

正如您在评论中注意到的那样,gem没有SSL支持。那是麻烦。为了解释答案,这是一个决议,以及对未来期望的一些后续步骤:

[now]覆盖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