gpt4 book ai didi

javascript - 将 websocket 与 Thin 结合使用

转载 作者:行者123 更新时间:2023-11-28 09:08:00 25 4
gpt4 key购买 nike

我正在尝试在瘦服务器上使用 websocket。以下代码尝试运行一个时钟,每 0.1 秒更新一次网页上的时间。

  • PAGE 是要呈现的初始页面的内容。
  • 瘦服务器通过 servesession 方法启动。
  • Websocket 由 websocket 方法启动。
  • tick_every 是一个实用函数,它在每个给定的时间间隔的正确时机调用一个 block 。

代码:

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

当我运行此命令并在 localhost:3000 打开网页时,websocket 在控制台中返回一条错误消息:

!! Unexpected error while processing request: no acceptor (port is in use or requires root privileges)

并在网页上显示初始时间,但三十秒内不更新(不确定,但这似乎是恒定的,这可能有一些意义),之后,它开始每0.1秒更新一次时钟.

  • 导致 websocket 出现错误消息的原因是什么?
  • 为什么它会暂停三十秒然后开始工作?
  • 这是结合 ajax 和 websocket 的正确方法吗?
  • 如何解决这些问题?

最佳答案

问题原来是,浏览器正在请求一个我没有设置的图标。也许,它会等到超时,大概是三十秒,然后才开始工作。该错误来自 favicon 请求。

关于javascript - 将 websocket 与 Thin 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com