在 Julia 中通过 websockets 发布协议缓冲区消息

Publishing protocol buffer messages over websockets in Julia

我正在做一个项目,我希望 Julia 服务器进程定期发布涉及某些二进制数据的消息。初始客户端将在 javascript 中编写,但我们最终希望能够以各种方式实现多个客户端。出于这个原因,我想使用协议缓冲区来定义消息。我找到了 3 个 Julia websocket 实现:WebSockets.jlSimpleSockets.jlHTTP.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