【发布时间】:2017-10-18 08:18:26
【问题描述】:
我一直在尝试使用 Crystal 和 Kemal 创建一个非阻塞服务器,它将 (a) 侦听发送给它的 UDP 消息流,然后 (b) 将该消息转发到 WebSocket 到任何浏览器已启动 ws 连接。
到目前为止,我能做到的最好的是:
require "kemal"
require "socket"
server = UDPSocket.new
server.bind "localhost", 1234
puts "Started..."
ws "/" do |socket|
udp_working = true
while udp_working
message, client_addr = server.receive
socket.send message
end
socket.on_close do
puts "Goodbye..."
udp_working = false
end
end
这一切似乎有点不雅,而且确实没有按预期工作,因为:
- 在正在启动的 Crystal 服务器和连接到 Crystal 服务器的第一个 Web 浏览器之间发送的所有 UDP 数据包都被缓存并在一个巨大的积压中发送
- 浏览器从 WebSockets 断开连接没有得到正确处理,即 socket.on_close 没有被触发,并且循环继续直到我终止 Crystal 服务器
我希望有一个 server.on_message 类型的处理,它使我能够仅在收到 UDP 数据包时运行代码,而不是阻止服务器的持续轮询。有没有其他方法可以使用 Crystal/Kemal 实现这一目标?
谢谢!
【问题讨论】:
标签: udp crystal-lang kemal