问题标签 [em-websocket]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - 初始化程序中的 WebSocket,不在分离模式下启动
我的 webapp 包含一个 HTTP 服务器和一个 WebSocket 服务器,它们都在 Rails 上运行。对于 Websockets,我使用的是在初始化程序中启动的 em-websocket,如下所示:
当我使用“rails s”启动服务器时,这可以正常工作,但它在分离模式下(“rails s -d”)不起作用。当我尝试通过 JS 连接到 Websocket 服务器时,它告诉我,它仍处于连接状态,所以我猜有什么东西阻止了它。我也认为这可能与线程有关。
我也尝试用瘦和独角兽启动服务器,但都无法启动 Websocket 服务器。
我在这里违反惯例吗?
ruby-on-rails - EventMachine::WebSocketClient.connect 导致 onclose 在服务器端触发
我的 Rails 应用程序包含三个部分:
- 侦听 HTML5 Web 套接字 ( em-websocket )的部分
- 一段连接到它们的 JavaScript
- 还有一部分任务是从同一个 Web 应用程序(em-websocket-client)内部连接到这些套接字(是的,我正在尝试在 Phusion Passenger 环境中做一些 IPC)
JavaScript 代码连接良好,Web 套接字服务器对这样的客户端很满意,但是当我从em-websocket-client
一个奇怪的事情连接时发生了:onclose
正在调用处理程序而不调用onopen
,而且 - 它被称为已由 Web 浏览器打开的套接字,不是em-websocket-client
。
相同的em-websocket-client
代码,当通过命令行在单独的 Ruby 脚本中执行时,按计划工作。这是em-websocket-client
代码示例:
onclose
一旦EventMachine::WebSocketClient.connect
在客户端执行,服务器端就会被调用。它甚至没有@conn.disconnect
来电。
我可以推测的另一件事是,这种行为是由于EventMachine
服务器和客户端在同一个 Rails 应用程序中使用了相同的机制。
ruby - 如何在 em-websocket 中广播或建立连接?
我正在使用 em-websocket 为客户端(可能 2 个或更多用户)进行通信。
在他们的介绍中。https://github.com/igrigorik/em-websocket
我想修改他们简单的回显服务器示例来达到我的目的。
但在他们的示例中,handshake.path 输出始终显示“/”。
我不知道客户来自哪里。
是否有任何解决方案可以知道客户端源位置并向所有人发送广播消息?
ruby - 在 Ruby 中的 HTTP 服务器(Sinatra 流)中建立 WebSocket 连接
我使用 Sinatra::Streaming(我使用 Ruby)编写了一个 HTTP 服务器(A)。它需要从 WebSocket 服务器 (B) 读取数据并将其转发给客户端 (C)。数据流是“B-->A-->C”。读写操作应该是实时的。
作为一种可能的解决方案,我尝试在 Sinatra 中创建一个 WebSocket 连接。代码是这样的:</p>
我已经尝试了几个 WebSocket 客户端库,例如 faye-websocket。程序~/.rvm/gems/ruby-2.0.0-p598/gems/sinatra-contrib-1.4.2/lib/sinatra/streaming.rb:100:in '<<': not opened for writing (IOError)
在执行时失败out << event.data
。WebSocket 连接同时关闭。
似乎WebSocket的IO冲突/关闭了Sinatra Stream的IO。
我目前创建了一个子进程来建立WebSocket连接,并让子进程与Sinatra服务器(A)进行通信。但是如果有几十个人访问A,可能会消耗过多的系统资源。而且,Sinatra Stream 服务器也经常因为not opened for writing (IOError)
客户端过多或等待时间过长而中止。
所以我的问题是
- 如何在 HTTP 流服务器中实现 WebSocket 客户端?(可以使用其他库代替 Sinatra)
- 如果可以在 Sinatra Stream 中实现 WebSocket 客户端,如何提高 Sinatra Stream 服务器的稳定性?(避免 IOError)
对不起我的英语不好。非常感谢!
ruby-on-rails - 在 Rails 上使用 Event Machine Websocket 进行聊天,在开发中运行瘦身,但不是在生产中
我在 Rails 应用程序上创建了一个实时聊天,并使用 EventMachine 运行 Websocket 进行实时聊天。实时聊天在多台机器上的本地主机上工作。
它还在 ubuntu 上开发中的 Amazon EC2 实例上工作,但是当我尝试将其移至生产环境时,实时聊天不再工作。没有数据来回发送。
这是我的控制器:
这是我在页面上的 javascript:
我正在使用以下命令运行我的服务器:
我的网站位于http://puppyplaydate.co/
控制台记录了这个
我使用 netstat 检查服务器是否正在侦听该端口并将其取回:
我在网上进行了研究,有人说他们使用“守护进程”gem 在生产环境中运行 websocket?我不确定这是否是我需要的东西。
我真的卡住了,提前感谢您的帮助!
ruby-on-rails - em-websocket send() 通过 2 个服务器从一个客户端发送到另一个客户端
我有两个 websocket 客户端,我想在它们之间交换信息。
假设我有两个套接字服务器实例,第一个是检索私有信息,过滤它并发送到第二个。
我试图做一些事情,但我得到了通常的暗代码,我不知道如何实现这个功能。
ruby - 看到由于 EventMachine 量子导致的长时间延迟 – 我怎样才能加快速度?
我正在使用 EventMachine 开发一个实时应用程序。两个客户端A
和B
,通过标准 TCP 或通过带有 em-websocket 的 WebSocket 连接到 EventMachine 服务器。
每次数据通过 EventMachine 时,代码执行需要 95 毫秒。与服务器对话时A
,有 95 毫秒的延迟。当A
与 交谈时B
,会有 190 毫秒的延迟。
如果许多请求快速连续发生,则延迟消失,但序列中的最后一个请求除外。所以,如果我发送 10 个快速请求,每个大约 5 毫秒后我会收到 9 个响应,但第 10 个响应又需要 95 毫秒。
我推断这与EventMachine.set_quantum 有关。从文档:
方法:EventMachine.set_quantum
对于高级用户。该函数设置默认的定时器粒度,默认略小于 100 毫秒。调用此函数可设置更高或更低的粒度。该函数影响 add_timer 和 add_periodic_timer 的行为。大多数应用程序不需要调用此函数。
避免将量程设置为非常低的值,因为这可能会降低某些极端条件下的性能。我们建议您不要使用低于 10 的值。
好吧,这就解释了 95ms 的来源。果然,调用改变了延迟EventMachine.set_quantum
,但由于文档中的警告,我对调整这个值持谨慎态度。
set_quantum
实际在做什么?我找不到有关量子变量含义的任何文档或解释。
我能做些什么来减少这些延迟?我想了解将量子减少到 10 毫秒的潜在影响。
EventMachine 是否是正确的选择?我基本上将它用作美化的 TCP 连接。也许我应该坚持使用原始套接字进行进程间通信,并找到一个不使用 EventMachine 的 WebSocket 服务器 gem。
ruby - 带有 em-websocket 的 Ruby 广告牌
我尝试构建一个广告牌,用于在服务器使用 sinatra 启动的浏览器中显示消息。在服务器代码中最明显的事情是这样的:
服务器:
索引.haml
应用程序.js
但是文本在最后一次睡眠后立即显示在浏览器中,因此只有最后一行可见。建立连接后,我似乎无法从服务器端发送内容,只能作为对传入消息的反应。
因此,我使用如下所示的 Ruby 客户端进行了尝试,但每次发送文本时都必须建立新连接,将循环放在 .callback 或 .stream 方法中不起作用。
我相信必须有更好的方法来实现这一点,请问哪种方式?