【问题标题】:Publishing protocol buffer messages over websockets in Julia在 Julia 中通过 websocket 发布协议缓冲区消息
【发布时间】:2020-11-30 15:10:24
【问题描述】:

我正在从事一个项目,我希望 Julia 服务器进程定期发布涉及一些二进制数据的消息。最初的客户端将用 javascript 编写,但我们最终希望能够拥有多个客户端,以各种方式实现。出于这个原因,我想使用协议缓冲区来定义消息。我发现了 3 个 Julia websocket 实现:WebSockets.jlSimpleSockets.jlHTTP.jl 的 WebSockets。我对WebSockets.jl 进行了一些天真的试验并得到了一个错误(“WebSockets 不支持字节 I/O”)。我的倾向是将注意力转移到HTTP.jl 实现上;我的印象是它的开发比WebSockets.jl 更积极。

更新:我继续我的实验。我被引导到以前的 SO 问题 unable to write binary data in 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)有任何经验,并就如何继续提出建议(“不要尝试”将被视为有用的反馈)。

【问题讨论】:

    标签: websocket julia protocol-buffers


    【解决方案1】:

    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[],这样您就可以随心所欲地使用它。

    【讨论】:

    • 我对 protobufs“正常工作”并不乐观——我已经更新了我的问题。
    【解决方案2】:

    我能够调整我在问题中展示的服务器实现,现在它可以工作了。这有点笨拙,我会暂缓接受我自己的答案,希望有更好的方法出现。无论如何,这是新版本:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多