6

Celluloid および Celluloid に基づく Websocket クライアント ( gem 'celluloid-websocket-client' ) を使用してリモート 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
4

1 に答える 1

5

コメントで気づいたように、gem にはSSLサポートがありませんでした。それが問題です。答えを説明するために、ここに解決策と、将来に期待される次のステップがあります。


[現在]メソッドをオーバーライドするCelluloid::WebSocket::Client::Connection

SSLこれは、現在の gem にサポートを提供するためのインジェクションの例です。私のものは実際には大幅に変更されていますが、これは基本的な解決策を示しています。

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エミッター メソッドも持つ呼び出し元のアクターを保持するために使用されます。私が言ったように、私のバージョンはストックの宝石とは大きく異なります。しかしその後:


[すぐに]Reel::IO::Client特定の脳損傷の近くで使用および回避します。

サポートに関してエキサイティングなことが進行中でWebSocketあり、WebSocket のサーバーとクライアントの両方の実装をリファクタリングする gem が登場しています。もうモンキーパッチは必要ありません!

すべての websocket 機能は、抽象化から抽出され、抽象化とReel組み合わされています。websocket-driverReel::IO::Server::Client

興味深いことに、これは、WebSocket からの移行Railsによって促されます。EventMachineCelluloid::IO

プレアルファはプレビュー用にオンラインです: https://github.com/celluloid/reel-io

于 2015-07-15T01:01:14.910 に答える