在Julia中通过WebSocket发布协议缓冲区消息
我正在做一个项目,我想让Julia服务器进程定期发布包含一些二进制数据的消息。最初的客户端将用javascript编写,但我们最终希望能够以各种方式实现多个客户端。因此,我想使用协议缓冲区定义消息。我已经找到了3个Julia websocket实现:在Julia中通过WebSocket发布协议缓冲区消息,websocket,julia,protocol-buffers,Websocket,Julia,Protocol Buffers,我正在做一个项目,我想让Julia服务器进程定期发布包含一些二进制数据的消息。最初的客户端将用javascript编写,但我们最终希望能够以各种方式实现多个客户端。因此,我想使用协议缓冲区定义消息。我已经找到了3个Julia websocket实现:websocket.jl,SimpleSockets.jl和HTTP.jl的websocket。我对WebSockets.jl做了一些天真的实验,结果发现一个错误(“WebSockets不支持字节I/O”)。我倾向于将注意力转移到HTTP.jl实现上
websocket.jl
,SimpleSockets.jl
和HTTP.jl
的websocket。我对WebSockets.jl
做了一些天真的实验,结果发现一个错误(“WebSockets不支持字节I/O”)。我倾向于将注意力转移到HTTP.jl
实现上;我得到的印象是,它的开发比WebSockets.jl更为积极
更新:我继续我的实验。我被引导到前面的一个问题,这是很有启发性的。在此之后,我在链接中对服务器实现进行了建模,得到:
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}}不支持字节I/O
我想知道阅读本文的人是否对这一特定的技术集群(julia、protobuf、websockets)有任何经验,以及如何继续的建议(“不要尝试”将被视为有用的反馈)。
HTTP.jl
websockets运行良好。我还没有用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
我对protobufs“只是工作”并不乐观——我已经更新了我的问题。