
[英]Send messages to clients at scale over APIGateway Websockets
[英]Publishing protocol buffer messages over websockets in Julia
我正在做一个项目,我希望有一个 Julia 服务器进程定期发布涉及一些二进制数据的消息。 初始客户端将使用 javascript 编写,但我们最终希望能够以各种方式实现多个客户端。 出于这个原因,我想使用协议缓冲区来定义消息。 我发现了 3 个 Julia websocket 实现: WebSockets.jl
, SimpleSockets.jl
和HTTP.jl
的 WebSockets. 我对WebSockets.jl
进行了一些天真的试验并得到了一个错误(“WebSockets 不支持字节 I/O”)。 我倾向于将注意力转移到HTTP.jl
实现上; 我的印象是它比WebSockets.jl
处于更积极的开发中。
更新:我继续我的实验。 我被引导到一个先前的 SO 问题,无法在 websocket 中写入二进制数据,这是有启发性的。 我在链接中建模了我的服务器实现,产生:
include("testmessage_pb.jl")
text = "A man spekith"
msg = TestMessage(someText=text)
function server(port)
@async HTTP.listen(Sockets.localhost, port) do http::HTTP.Stream
if HTTP.WebSockets.is_upgrade(http.message)
HTTP.WebSockets.upgrade(http, binary=true) do ws
while !eof(ws)
data = readavailable(ws)
IOExtras.startwrite(ws)
writeproto(ws, msg)
IOExtras.closewrite(ws)
end
end
end
end
end
运行它,我得到一个非常像我之前报告的错误: HTTP.WebSockets.WebSocket{HTTP.ConnectionPool.Transaction{Sockets.TCPSocket}} does not support byte I/O
我想知道阅读这篇文章的人是否对这个特定的技术集群(julia、protobuf、websockets)有任何经验以及如何进行的建议(“不要尝试”将被视为有用的反馈)。
HTTP.jl
websocket 工作正常。 没有用 protobuf 尝试过,但应该不会有任何问题。 基本上是
HTTP.WebSockets.open(data_url) do ws
x = readavailable(ws)
# Do protobuf related things, generate response
write(ws, response)
end
readavailable
返回你UInt8[]
所以你可以用它做任何你想做的事情。
我能够调整我在问题中显示的服务器实现,它现在可以工作了。 这有点笨拙,我会暂缓接受我自己的答案,希望有更好的方法出现。 无论如何,这是新版本:
function server(port)
@async HTTP.listen(Sockets.localhost, port) do http::HTTP.Stream
if HTTP.WebSockets.is_upgrade(http.message)
HTTP.WebSockets.upgrade(http, binary=true) do ws
while !eof(ws)
data = readavailable(ws)
iob = PipeBuffer()
writeproto(iob, msg)
write(ws, take!(iob))
end
end
end
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.