Подключение к удаленному серверу с помощью веб-сокетов - PullRequest
0 голосов
/ 07 мая 2018

Я бы хотел подключиться к внешнему серверу, который предоставляет данные через веб-сокеты (ws://). В этом случае мой сервер будет действовать как клиент для внешнего сервера.

Документация ActionCable содержит только примеры, когда приложение Rails предоставляет веб-сокеты клиентам Javascript (обычно это интерфейс, обслуживаемый самим приложением Rails). Похоже, он не показывает случаи, когда целью является открытие клиента websocket в Ruby.

Вопросы:

  1. Как приложение Rails может создать клиент websocket для связи с другим сервером?
  2. Если Rails не предоставляет эту функциональность через ActionCable, как это можно сделать в чистом Ruby?
  3. При поиске решения этой проблемы можно найти несколько не поддерживаемых проектов с открытым исходным кодом (например, https://github.com/websocket-rails/websocket-rails). Если ActionCable не поддерживает описанную функциональность, какой сторонний гем, если таковой имеется, считается стандарт

1 Ответ

0 голосов
/ 07 мая 2018

ActionCable не предоставляет функциональные возможности для создания клиентского сервера. Как вы можете видеть в repo , в исходном коде нет ни одного сервера-клиента. Но ActionCable использует Faye WebSocket. Таким образом, соединение с gem 'faye-websocket' от сервера до кабеля Action может выглядеть следующим образом:

 EM.run {
   ws = Faye::WebSocket::Client.new("ws://localhost:3000/cable")
   ws.on :message do |e| puts e.data end
   ws.on :close do |e| puts 'close' end
 }

Итак, это показывает реакцию на пинг и отключение. Но должны быть некоторые проблемы с подключением к каналу. Вы можете попробовать собрать WebSocket с Faye, а затем подключиться к нему из Faye Client.

Но нет причин для этого. Каждый сервер уже прослушивает любой HTTP-запрос и запускает какой-то метод, когда это происходит. Нет причин слушать что-то еще все время тоже. Кроме того, ruby ​​может передавать все, что угодно, и это может быть облегчено с помощью RestClient - возможно, это лучшее решение для вас, чем использование межсерверного WebSocket

...