我一直在尝试使用Crystal和Kemal创建一个非阻塞服务器,它将(a)侦听发送给它的UDP消息流,然后(b)然后转发该消息发送给任何已启动ws连接的浏览器的WebSocket。使用Crystal/Kemal来侦听UDP数据包
到目前为止,我可以管理最好的是:
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
这一切似乎有点不雅,而事实上,没有按预期工作,因为:
- 在所有发送的UDP数据包在启动的Crystal服务器和连接到Crystal服务器的第一个Web浏览器之间缓存并发送一个巨大的积压文件
- 从WebSockets断开连接的浏览器未正确处理,即没有触发socket.on_close,第二循环继续,直到我终止水晶服务器
我希望的是server.on_message型处理,这将使我只有在收到UDP数据包,而不是持续轮询哪些块服务器来运行代码。有没有另外一种方法可以使用Crystal/Kemal来实现这一点?
谢谢!