我一直在尝试使用Crystal和Kemal创建一个非阻塞服务器,它可以(a)监听发送到它的UDP消息流,并且(b)将该消息转发给已经建立ws连接的任何浏览器的WebSocket。
到目前为止,我最好的解决方案是:
这一切似乎有点不太优雅,而且实际上并不能按预期工作,因为:
谢谢!
到目前为止,我最好的解决方案是:
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服务器和第一个Web浏览器连接到Crystal服务器之间发送的所有UDP数据包都被缓存,并以一个巨大的滞留事件发送
- 不能正确处理从WebSockets断开连接的浏览器,即未触发socket.on_close,循环持续直至我终止Crystal服务器
谢谢!