Javascript 将websocket与薄
我正在尝试在精简服务器上使用websocket。以下代码试图运行一个时钟,每0.1秒更新一次网页上的时间Javascript 将websocket与薄,javascript,ruby,ajax,websocket,thin,Javascript,Ruby,Ajax,Websocket,Thin,我正在尝试在精简服务器上使用websocket。以下代码试图运行一个时钟,每0.1秒更新一次网页上的时间 PAGE是要呈现的初始页面的内容 瘦服务器通过service和session方法启动 Websocket由Websocket方法启动 tick_every是一个实用函数,它在给定的每个时间间隔的正确时间调用块 代码: 并在网页上显示初始时间,但在30秒内不更新(不确定,但这似乎是恒定的,这可能有一定的意义),然后,它开始每0.1秒更新一次时钟 是什么导致了来自websocket的错误消
是要呈现的初始页面的内容PAGE
- 瘦服务器通过
和service
方法启动session
- Websocket由
方法启动Websocket
是一个实用函数,它在给定的每个时间间隔的正确时间调用块tick_every
- 是什么导致了来自websocket的错误消息
- 为什么它会暂停30秒然后开始工作
- 这是结合ajax和websocket的正确方法吗
- 如何解决这些问题
require "rack"
require "thin"
require "em-websocket"
PAGE = <<_
<html>
<body><div id="output"></div></body>
<script>
window.addEventListener("load", init, false);
function init(){
websocket = new WebSocket("ws://localhost:4000");
websocket.onmessage = function(evt){
document.getElementById("output").innerHTML = evt.data;
};
}
</script>
<div id="output"></div>
</html>
_
def serve
Rack::Handler::Thin.run(Rack::Builder.new do
map("/"){run(->env{session(env)})}
end, Port: 3000)
end
def session env
websocket(env["SERVER_NAME"])
[200, {}, [PAGE]]
end
def websocket host
EM.run do
EM::WebSocket.run(host: host, port: 4000) do |ws|
ws.onopen do
tick_every(0.1){|t| ws.send "The time now since epoch in sec is #{t}"}
end
end
end
end
def tick_every sec, &pr
Thread.new do loop do
t = Time.now.to_f # present time in micro seconds
frac = t.modulo(sec.to_f) # fractional (decimal) part of it w.r.t. `sec`
pr.call((t - frac).round(6)) # calls the block, passing the present time with precision of `sec`
sleep(sec - frac) # wait for the next flat `sec`
end end
end
serve
!! Unexpected error while processing request: no acceptor (port is in use or requires root privileges)