我一直在嘗試使用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來實現這一點?
謝謝!