带有em websocket的Ruby广告牌
我尝试构建一个广告牌,用于在服务器使用sinatra启动的浏览器中显示消息。在服务器代码中要做的最直观的事情是: 服务器:带有em websocket的Ruby广告牌,ruby,web-services,sinatra,em-websocket,em-websocket-client,Ruby,Web Services,Sinatra,Em Websocket,Em Websocket Client,我尝试构建一个广告牌,用于在服务器使用sinatra启动的浏览器中显示消息。在服务器代码中要做的最直观的事情是: 服务器: require 'em-websocket' require 'yajl' require 'haml' require 'sinatra/base' require 'thin' $channel = EM::Channel.new EventMachine.run do class App < Sinatra::Base get '/' do
require 'em-websocket'
require 'yajl'
require 'haml'
require 'sinatra/base'
require 'thin'
$channel = EM::Channel.new
EventMachine.run do
class App < Sinatra::Base
get '/' do
haml :index
end
end
EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |ws|
ws.onopen {
sid = $channel.subscribe { |msg| ws.send msg }
ws.onmessage { |msg| $channel.push msg}
# the text I periodically send to the server and want to be visible in the connected webbrowsers
1.upto(5) {|i| sleep 3; ws.send "Hello #{i}"} #had to remove this
}
end
App.run!({:port => 3000})
end
app.js
$(function(){
ws = new WebSocket("ws://localhost:8080");
ws.onmessage = function(evt) {
if (evt.data!='done'){
document.getElementById("show").innerHTML = evt.data;
}
};
});
但在最后一次睡眠后,文本会立即显示在浏览器中,因此只有最后一行可见。一旦建立了连接,我似乎无法从服务器端发送内容,只是作为对输入消息的反应
因此,我尝试使用下面这样的Ruby客户端,它可以工作,但每次发送一些文本时,我都必须建立一个新的连接,将循环放入.callback或.stream方法不起作用
require 'em-websocket-client'
def send text
EM.run do
conn = EventMachine::WebSocketClient.connect("ws://localhost:8080")
conn.callback do
conn.send_msg text
conn.send_msg "done"
end
conn.stream do |msg|
puts "<#{msg}>"
if msg.data == "done"
conn.close_connection
end
end
conn.disconnect do
EM::stop_event_loop
end
end
end
1.upto(5) do |i|
sleep 3
send "Hello #{i}"
end
需要“em websocket客户端”
def发送文本
嗯,跑吧
conn=EventMachine::WebSocketClient.connect(“ws://localhost:8080”)
康涅狄格州
连接发送消息文本
连接发送消息“完成”
结束
康涅狄格河道| msg|
放置“”
如果msg.data==“完成”
连接关闭连接
结束
结束
康涅狄格州
EM::停止事件循环
结束
结束
结束
1.最多(5)个do | i|
睡眠3
发送“你好{i}”
结束
我相信一定有更好的方法来实现这一点,请问哪种方法
require 'em-websocket-client'
def send text
EM.run do
conn = EventMachine::WebSocketClient.connect("ws://localhost:8080")
conn.callback do
conn.send_msg text
conn.send_msg "done"
end
conn.stream do |msg|
puts "<#{msg}>"
if msg.data == "done"
conn.close_connection
end
end
conn.disconnect do
EM::stop_event_loop
end
end
end
1.upto(5) do |i|
sleep 3
send "Hello #{i}"
end