在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实现上

我正在做一个项目,我想让Julia服务器进程定期发布包含一些二进制数据的消息。最初的客户端将用javascript编写,但我们最终希望能够以各种方式实现多个客户端。因此,我想使用协议缓冲区定义消息。我已经找到了3个Julia websocket实现:
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“只是工作”并不乐观——我已经更新了我的问题。