【发布时间】:2021-01-26 14:14:50
【问题描述】:
我有一个应用程序,其中有一个中间人函数,它在 Julia Channel 上监听数据并立即将数据写入 HTTP.WebSocket 对象。在 websocket 的另一端有某种客户端,假设它是在浏览器中运行的 JavaScript。我创建了一个绑定到中间人函数的Task 对象。例如,我希望客户端关闭 websocket,并让该操作导致 Task 完成。这是我的中间人的样子:
function listener(port::Int64, channel::Channel)
HTTP.listen(Sockets.localhost, port) do http::HTTP.Stream
if HTTP.WebSockets.is_upgrade(http.message)
HTTP.WebSockets.upgrade(http, binary=true) do ws
try
while !eof(ws)
_ = readavailable(ws)
bytes = take!(channel)
write(ws, bytes)
end
catch err
if isa(err, InvalidStateException)
@info "Channel for $port is closed, exiting"
end
end
end
end
end
end
我看到listener() 对 websocket 的关闭做出反应——它捕获了一个InvalidStateException——但Task 的状态仍然是:runnable。您会注意到我目前忽略了客户端 (_ = readavailable(ws)) 发送的消息的内容。我已经进行了一些检查特殊值(例如“完成”)的试验,但这种方法没有比让客户端关闭 websocket 更好的运气了。
【问题讨论】: