在 Julia 中通过 websockets 发布协议缓冲区消息
Publishing protocol buffer messages over websockets in Julia
我正在做一个项目,我希望 Julia 服务器进程定期发布涉及某些二进制数据的消息。初始客户端将在 javascript 中编写,但我们最终希望能够以各种方式实现多个客户端。出于这个原因,我想使用协议缓冲区来定义消息。我找到了 3 个 Julia websocket 实现:WebSockets.jl
、SimpleSockets.jl
和 HTTP.jl
的 WebSocket。我用 WebSockets.jl
做了一些幼稚的试验并得到了一个错误(“WebSockets 不支持字节 I/O”)。我倾向于将注意力转移到 HTTP.jl
实施上;我的印象是它的开发比 WebSockets.jl
.
更活跃
更新:我继续我的实验。我被引导到以前的 SO 问题 unable to write binary data in websocket,这很有启发性。我在 link 之后为我的服务器实现建模,得到:
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
websockets 工作正常。 Havn't tried it with protobuf,但几乎不应该有任何问题。基本上是
HTTP.WebSockets.open(data_url) do ws
x = readavailable(ws)
# Do protobuf related things, generate response
write(ws, response)
end
readavailable
returns 你 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
我正在做一个项目,我希望 Julia 服务器进程定期发布涉及某些二进制数据的消息。初始客户端将在 javascript 中编写,但我们最终希望能够以各种方式实现多个客户端。出于这个原因,我想使用协议缓冲区来定义消息。我找到了 3 个 Julia websocket 实现:WebSockets.jl
、SimpleSockets.jl
和 HTTP.jl
的 WebSocket。我用 WebSockets.jl
做了一些幼稚的试验并得到了一个错误(“WebSockets 不支持字节 I/O”)。我倾向于将注意力转移到 HTTP.jl
实施上;我的印象是它的开发比 WebSockets.jl
.
更新:我继续我的实验。我被引导到以前的 SO 问题 unable to write binary data in websocket,这很有启发性。我在 link 之后为我的服务器实现建模,得到:
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
websockets 工作正常。 Havn't tried it with protobuf,但几乎不应该有任何问题。基本上是
HTTP.WebSockets.open(data_url) do ws
x = readavailable(ws)
# Do protobuf related things, generate response
write(ws, response)
end
readavailable
returns 你 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