Сетчатые накладки Padrino + Heroku; Соединение закрыто до получения ответа на рукопожатие

Я использую веб-сокеты padrino ( https://github.com/dariocravero/padrino-websockets) для создания системы чата для моего сайта, и она отлично работает на моем локальном компьютере. Однако после развертывания на heroku (бесплатно) веб-сокет не установит соединение и вернется

failed: Connection closed before receiving a handshake response

Он отлично работает на локальном хосте, где я использую это для подключения:

connection = new WebSocket('ws://localhost:3000/channel');

Но при использовании на героку с этим:

connection = new WebSocket('ws://******.herokuapp.com:3000/channel');

возвращает ошибку рукопожатия (выше)

Моя реализация на стороне сервера

websocket :channel do
  on :newmessage do |message|
    currentAccount = Account.find_by(lastLoginIP: message["ip"]) rescue nil

    if currentAccount != nil
      broadcast :channel, {
        "name" => currentAccount.nickname,
        "url" => currentAccount.url,
        "image" =>  currentAccount.image,
        "chatmessage" => message["chatmessage"][0..80]
        }
    end

  end
end

внутри моего главного приложения Padrino.rb, и это в моем Procfile. Что здесь происходит?

web: bundle exec puma -t 1:16 -p ${PORT:-3000} -e ${RACK_ENV:-production}

1 ответ

Ваш порт Websocket (3000) не является общедоступным на Heroku.

Heroku перенаправляет любые запросы, сделанные на порт 80 или порт 443, на динамический порт вашей веб-камеры, сохраненный в $PORT переменная bash.

В вашем браузере (клиенте) попробуйте заменить эту строку:

 connection = new WebSocket('ws://localhost:3000/channel');

С этой строкой:

 connection = new WebSocket('ws://' + window.document.location.host + 'channel');

Или, если вы хотите поддерживать как SSL, так и незашифрованные веб-сокеты:

 ws_uri = (window.location.protocol.match(/https/) ? 'wss' : 'ws') +
          '://' + window.document.location.host + 'channel';
 connection = new WebSocket(ws_uri)

Это должно работать, если ваше приложение и слой websocket используют один и тот же сервер.

Другие вопросы по тегам