我有一个rails应用程序我在瘦服务器上运行以利用EventMachine运行循环.问题是我希望能够包含em-websocket来处理来自ws的信息,并在不停止EM运行循环的情况下停止并启动websocket.这就是我启动websocket的方式.
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen { }
ws.onclose { }
ws.onmessage { |msg| }
end
Run Code Online (Sandbox Code Playgroud)
问题出在启动/停止代码中.来自em-websocket的文档
#Start WebSocket
def self.start(options, &blk)
EM.epoll
EM.run do
trap("TERM") { stop }
trap("INT") { stop }
EventMachine::start_server(options[:host], options[:port],
EventMachine::WebSocket::Connection, options) do |c|
blk.call(c)
end
end
end
#Stop WebSocket
def self.stop
puts "Terminating WebSocket Server"
EventMachine.stop
end
Run Code Online (Sandbox Code Playgroud)
问题是内部的em-websocket代码不跟踪来自EM:start_server的签名,以便能够调用EventMachine :: stop_server(签名)来关闭它.有没有办法可以在不修改em-websocket的情况下覆盖这些函数,这样我就可以安全地启动/停止这些websockets?我想它的表现更像是标准的Eventmachine服务器.
我正在构建像WhatsApp这样的消息传递应用程序.我的目标是通过Rails只暴露REST API,并通过websockets将"推送通知"暴露给连接的客户端.因此,客户端仅使用REST API与服务器通信.只有服务器通过websocket发送数据.客户端只能从中接收数据.
目前我已经构建了一个eventmachine服务器,用于监听websocket连接和Unix域套接字连接.当客户端在REST API上执行请求时,Rails会连接到Unix域套接字,以告知事件处理器需要通过websocket通知哪些连接的客户端.
我关心的是它在生产中的表现(我的服务器运行Apache Passenger).所以我正在寻找一些解决我问题的项目.我看了看Faye,但我无法理解如何强制它从外部进程(在执行请求时可能是rails)向连接的客户端发送通知.有任何想法吗?
我正在编写一个应用程序来跟踪在某个任务的用户之间推送的内容。我正在考虑使用 WebSockets 发送新内容,因为它们可供当前使用该应用程序执行该给定任务的所有用户使用。
我在 Rails 上写这篇文章,客户端应用程序在 iOS 上(可能也会在 Android 上)。恐怕这个 WebSocket 解决方案可能无法很好地扩展。在决定使用 WebSockets 还是使用某种轮询解决方案时,我正在寻求一些建议和需要考虑的事项。
Ruby on Rails 服务器(如 Heroku)是否支持同时打开大量 WebSocket?为了争论,让我们说一百万个连接。任何人都可以向我提供此类东西的任何材料?
如果我以这种方式构建它,在服务器托管上会花费更多吗?
甚至可以同时维护数百万个 WebSockets 吗?我觉得这可能不是最好的设计决定。
这是我第一次尝试正确的 Rails API。任何意见是极大的赞赏。谢谢。
我正在尝试使用JavaScript在我的Rails应用程序中创建一个简单的WebSocket连接.我得到以下内容:
与'ws:// localhost:4000 /'的WebSocket连接失败:WebSocket握手期间出错:'Sec-WebSocket-Accept'标头丢失
我究竟做错了什么?这是我的代码:
JavaScript的:
var socket = new WebSocket('ws://localhost:4000');
socket.onopen = function() {
var handshake =
"GET / HTTP/1.1\n" +
"Host: localhost\n" +
"Upgrade: websocket\n" +
"Connection: Upgrade\n" +
"Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\n" +
"Sec-WebSocket-Protocol: quote\n" +
"Sec-WebSocket-Version: 13\n" +
"Origin: http://localhost\n";
socket.send(handshake);
};
socket.onmessage = function(data) {
console.log(data);
};
Run Code Online (Sandbox Code Playgroud)
红宝石:
require 'rubygems'
require 'em-websocket-server'
module QuoteService
class WebSocket < EventMachine::WebSocket::Server
def on_connect
handshake_response = "HTTP/1.1 101 Switching Protocols\n"
handshake_response << "Upgrade: websocket\n"
handshake_response << "Connection: Upgrade\n"
handshake_response << "Sec-WebSocket-Accept: …Run Code Online (Sandbox Code Playgroud) em-websocket ×4
websocket ×3
ruby ×2
eventmachine ×1
faye ×1
html ×1
ipc ×1
javascript ×1
thin ×1