繁体   English   中英

通过 Julia 中的 websocket 发布协议缓冲区消息

[英]Publishing protocol buffer messages over websockets in Julia

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

更新:我继续我的实验。 我被引导到一个先前的 SO 问题,无法在 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)有任何经验以及如何进行的建议(“不要尝试”将被视为有用的反馈)。

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[]所以你可以用它做任何你想做的事情。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM