Tag: websocket

当我在Unicorn服务器上运行时,Websockets在我的Rails应用程序中不起作用,但在瘦服务器上运行

我正在学习Ruby on Rails,在Heroku上使用WebSockets构建一个实时Web应用程序,但我无法弄清楚为何在Unicorn服务器上运行时websocket连接失败。 我将我的Rails应用程序配置为使用Procfile在本地和Heroku上运行Unicorn … web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb …我在本地开始与$foreman start 。 在javascript中在客户端上创建websocket连接时发生故障… var dispatcher = new WebSocketRails(‘0.0.0.0:3000/websocket’); //I update the URL before pushing to Heroku …在Chrome Javascript控制台中出现以下错误, ‘websocket connection to ws://0.0.0.0:3000/websocket’ failed. Connection closed before receiving a handshake response. ‘websocket connection to ws://0.0.0.0:3000/websocket’ failed. Connection closed before receiving a handshake […]

ActionCable – 如何显示已连接用户的数量?

我正在尝试使用Action Cable创建一个简单的类似聊天的应用程序(计划扑克应用程序)。 我对术语,文件层次结构以及回调如何工作有点困惑。 这是创建用户会话的操作: class SessionsController < ApplicationController def create cookies.signed[:username] = params[:session][:username] redirect_to votes_path end end 然后,用户可以发布应该向所有人广播的投票: class VotesController < ApplicationController def create ActionCable.server.broadcast 'poker', vote: params[:vote][:body], username: cookies.signed[:username] head :ok end end 到目前为止,一切都很清楚,并且工作正常。 问题是 – 如何显示已连接用户的数量? 当用户(消费者?)连接时,JS中是否会触发回调? 我想要的是当我在隐身模式下在3个不同浏览器中打开3个标签时,我想显示“3”。 当新用户连接时,我希望该数字递增。 如果任何用户断开连接,则该号码应减少。 我的PokerChannel : class PokerChannel < ApplicationCable::Channel def subscribed stream_from 'poker' end end app/assets/javascripts/poker.coffee […]

websocket-rails在生产中没有连接

我正在使用websocket-rails gem for websocket连接到我的rails应用程序 – 事情是它在我的计算机上完美运行 – 但在我的生产机器上它将无法正常工作。 当我连接 – 它写入websocket_rails日志 – 我已连接 – 但是当我尝试将数据发送到连接时 – 它什么也没做。 我添加了一些日志来帮助我找到问题,似乎WebsocketRails.users是空的 – 意味着没有连接 – 即使有。 但是,当我真正断开websocket连接时,它会记录断开连接 – 并查看代码,它会在记录断开连接之前检查它是否已连接 – 所以我发现它已连接。 这是触发连接事件的代码 class Route channel.name, :token => channel.token options[:data] = data event = WebsocketRails::Event.new :location_updated, options connection.trigger event end end end

Ctrl + C不会杀死Sinatra + EM :: WebSocket服务器

我正在构建一个运行EM :: WebSocket服务器和Sinatra服务器的Ruby应用程序。 单独地,我相信这两个都配备了处理SIGINT。 但是,当在同一个应用程序中运行时,当我按Ctrl + C时,应用程序会继续运行。 我的假设是其中一个捕获SIGINT,阻止另一个捕获它。 不过,我不知道如何修复它。 这里的代码简而言之: require ‘thin’ require ‘sinatra/base’ require ’em-websocket’ EventMachine.run do class Web::Server < Sinatra::Base get('/') { erb :index } run!(port: 3000) end EM::WebSocket.start(port: 3001) do |ws| # connect/disconnect handlers end end

Rails中的用户会话认证5

我正在尝试使用Rails 5中的操作电缆实现通知。 阅读Action电缆教程后,该电缆在会话和基于Cookie的身份validation上工作,以接收当前登录用户的通知。 module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user logger.add_tags 'ActionCable', current_user.username end protected def find_verified_user if verified_user = env['warden'].session(:user) verified_user else reject_unauthorized_connection end end end 在find_verified_user中,我无法从会话中获取用户对象。 任何人都可以帮助我,在行动电缆中validation用户。

如何使用Rails通过Web套接字发送二进制文件

我有一个Rails应用程序,用户上传音频文件。 我想将它们发送到第三方服务器,我需要使用Web套接字连接到外部服务器,因此,我需要我的Rails应用程序作为websocket客户端。 我正在试图找出如何正确设置它。 我还没有承诺任何gem,但’faye-websocket’gem看起来很有前途。 我甚至在“ 超时之前在websocket中发送大文件 ”中找到了类似的答案,但是,使用该代码对我来说不起作用。 以下是我的代码示例: @message = Array.new EM.run { ws = Faye::WebSocket::Client.new(“wss://example_url.com”) ws.on :open do |event| File.open(‘path/to/audio_file.wav’,’rb’) do |f| ws.send(f.gets) end end ws.on :message do |event| @message << [event.data] end ws.on :close do |event| ws = nil EM.stop end } 当我使用它时,我从收件人服务器收到错误: No JSON object could be decoded 这是有道理的,因为我不相信它为faye-websocket正确格式化。 他们的文件说: send(message)接受字符串或字节大小的数组,并通过连接向另一个对等体发送文本或二进制消息; 二进制数据必须编码为数组。 […]

如何从我的sinatra应用程序中的类传递数据到websocket-rack?

我在sinatra应用程序中有一个websocket-rack的工作配置,用于具有多个屏幕的物理安装。 有一些function可以使消息在websockets中来回传递。 我的问题是这样的:我有一个页面带有标准的Web表单(即不是websocket表单),我的目标是从该表单中收集params,将params转换为字符串变量,然后发送该变量的内容(字符串)通过websocket到不同的页面/屏幕。 对于我的生活,我无法弄清楚如何做一个应该是一个相对简单的任务,因为从我的应用程序中的主类,我无法与我的Socket类进行通信,从我理解的基本上是机架应用。 我试图通过将resque设置为中间人来解决它,但很快发现我的问题没有改变。 我无法弄清楚如何从另一个类调用方法和/或将变量传递给Socket,以便它将推送到浏览器。 基本上,我有一个app.rb是这样的: module SomeThing class App < Sinatra::Base get '/' do #show a form end post '/submit' do #receive params #save params new_message = params.inspect #dream up some way to pass new_message to websocket end post '/otherscreen' do #have an open websocket to receive new_message end end class Socket < […]

close似乎不适用于WebSocket

我有这个简单的JavaScript代码: window.ws = new WebSocket(‘ws://127.0.0.1:8000/’); ws.onopen = function() { ws.send(‘hello’); } Ruby中的服务器如下: require ’em-websocket’ class Websocket def run EventMachine.run do EM::WebSocket.start(host: ‘0.0.0.0’, port: ‘8000’) do |ws| ws.onopen do |handshake| puts “Connected” end ws.onclose do puts “Closed” end ws.onmessage do |msg| p msg end end end end end 当连接关闭时,服务器应打印“已关闭”。 在浏览器中,当我执行window.ws.close() ,服务器没有收到任何内容,但是当我重新加载页面时,它会打印该消息。 有没有办法迫使客户说出连接关闭?

如何在ActionCable中发送WebSocket请求的状态

有没有办法在ActionCable频道中向客户端发送请求状态? 例如,如果发送的数据无效(或者引发了一些未知exception),我想在响应消息中出错文本,否则发送’status:ok’。 我现在在客户端有的是subscriber的perform方法,几乎​​在任何情况下都能返回true ,我们可以从源代码( github )看到: send: (data) -> if @isOpen() @webSocket.send(JSON.stringify(data)) true else false 在websocket-rails gem中有以下方法: trigger_failure和trigger_success 。

在ruby中保护Websocket客户端

如何使用Ruby中的Faye-websocket建立安全(TLS)websocket客户端连接? 我在我的脚本中使用faye / websocket gem。 require ‘faye/websocket’ require ‘eventmachine’ EM.run { ws = Faye::WebSocket::Client.new(‘wss://aws.com/gateway’,:ssl => { :private_key_file => ‘path/to/ssl.key’, :cert_chain_file => ‘path/to/ssl.crt’ }, :headers => { ‘Authorization’ => ‘Basic bXl1c2VyOm15cGFzc3dvcmQ=’}) ws.on :open do |event| p [:open] ws.send(‘Hello, world!’) end ws.on :message do |event| p [:message, event.data] end ws.on :close do |event| p [:close, event.code, event.reason] […]