Как я могу реализовать безопасный клиент websocket в ruby? - PullRequest
0 голосов
/ 27 мая 2020

Как я могу создать клиентское соединение WSS в J Ruby framework?

Я использую гем faye / websocket-driver- ruby для подключения и публикации сообщения, может ли кто-нибудь предоставить информацию об этом.

Получение ошибки,

IOError: сброс подключения одноранговым sysread в org / jruby / ext / openssl / SSLSocket. java: 857,

Пожалуйста, дайте мне знать, что Я делаю неправильно.

require 'bundler/setup'
require 'eventmachine'
require 'websocket/driver'
require 'permessage_deflate'
require 'socket'
require 'uri'
require "openssl"

class WSSClient
  DEFAULT_PORTS = { 'ws' => 80, 'wss' => 443 }

  attr_reader :url, :thread

  def initialize
    @url  = "wss://localhost:433/wss"
    @uri  = URI.parse(@url)
    @port = @uri.port || DEFAULT_PORTS[@uri.scheme]

    ssl_context = OpenSSL::SSL::SSLContext.new
    ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE

    @socket  = TCPSocket.new(@uri.host, @port)

    ssl_context.ssl_version = :TLSv1_2_client

    ssl_socket = OpenSSL::SSL::SSLSocket.new(@socket, ssl_context)
    ssl_socket.sync_close = true
    ssl_socket.connect

    @driver = WebSocket::Driver.client(self)

    @driver.add_extension(PermessageDeflate)

    str = "Hello server!"

    str = str + "\n"

    @dead = false
    @driver.on(:open) { |event|  write str } 
    @driver.on(:message) { |event| p [:message, event.data] }
    @driver.on(:close)   { |event| finalize(event) }
    @thread = Thread.new do
      @driver.parse(ssl_socket.read(1)) until @dead
    end
    @driver.start
  end

  def send(message)
    @driver.text(message)
  end

  def write(data)
    ssl_socket.write(data)
  end

  def close
    @driver.close
  end

  def finalize(event)
    p [:close, event.code, event.reason]
    @dead = true
    @thread.kill
  end
end

Или любой другой способ (алгоритм) для создания клиента WSS.

...