【问题标题】:Sending images/files over Sockjs + Spring Websocket + Stomp通过 Sockjs + Spring Websocket + Stomp 发送图像/文件
【发布时间】:2015-09-15 16:06:41
【问题描述】:

我正在使用 Spring websockets(STOMP 作为子协议)和 Sockjs 开发一个消息传递应用程序。

我应该支持在消息中发送文件。

根据this ticket,sockjs 不支持二进制数据,但是 STOMP 支持。

我知道我们可以将图像转换为 base64 并通过 stomp 发送,但我认为这不是最佳实践,因为存在大量转换和开销。我还必须保存消息,所以要再次将这个 base64 编码文件保存在服务器上,我必须对它们进行解码。

我有几个问题:

1) 是否有解决方法通过 sockjs + stomp 发送图像/文件,转换为 Base64 是唯一的方法?

2) 这可能是一个非常愚蠢的问题,但根据this question,可以通过 STOMP(不带 sockjs)发送二进制数据。没有 sockjs 支持 fallback 有多难?

谢谢。

编辑如果使用 base64 是唯一的选择,我宁愿发出 POST 请求来保存带有附件的消息,而不是使用 base64 编码。有什么更好的想法吗?

【问题讨论】:

    标签: javascript stomp spring-websocket sockjs


    【解决方案1】:

    如果是 base64 编码,任何 Web Socket 实现都会处理二进制数据。这实际上将二进制流序列化为字符串。所有套接字传输和包装器都可以处理字符串数据。任何 Java base64 实现都应该可以工作。

    在浏览器方面,base64 在现代浏览器中使用btoa()atob() 本地处理。如果您支持旧版浏览器,您可能需要一个 polyfill。

    也就是说,如果 Java 服务器只是在 Web 用户之间代理消息,则不需要在 Java 中解码图像,只需将字符串编码的图像从一个套接字连接传递到另一个套接字连接。

    【讨论】:

    • 普通 websocket 实现支持二进制数据,我知道这一点。但我特别想知道SockJS 是否有任何黑客/周转。
    • 我知道我们可以使用 base64 编码,但我一直在寻找替代方案,因为这个应用程序有非常频繁的带有附件的消息。因此使用 base64 会不必要地增加大小。
    • 但它会流式传输,还是只是在发送前对字符串操作进行一次性编码。换句话说,为此目的使用 WebSockets 是否有效?
    【解决方案2】:

    另一种选择是仅使用 WebRTC 来发送二进制图像。这样做的好处之一是这些消息将是纯粹的点对点的。您只需要在您的 Web 应用程序中而不是在您的后端实现它。然后,您无需为图像使用的带宽付费。不幸的是,IE 不支持 WebRTC。

    【讨论】:

    • 这不会解决问题吧?我必须将消息保存在服务器中。使用 WebRTC 将无法进行离线消息传递。
    • 是的。如果这不是实时应用程序,我不知道为什么要使用 websockets 发送二进制数据。如果您正在排队消息,使用分段上传会更有意义。
    • 一个用户可以通过一个websocket连接与不同的在线用户聊天,如果他想给一个离线用户发送消息,我可以使用相同的websokcet连接。为什么客户端要关心用户是否在线?
    【解决方案3】:

    你看看 binaryjs 。承诺使用 websockets 为 web 实时二进制流。

    让我们检查示例

    https://github.com/binaryjs/binaryjs/tree/master/examples

    您应该检查Atmosphere(wasync),链接将指导您如何实施。

    就您在客户端的浏览器回退方案而言,您可以使用 [base64 polyfill lib (https://github.com/davidchambers/Base64.js/) 。

    最好的问候

    【讨论】:

    • 我想你可能误解了我的问题,我不是在寻找支持二进制的东西,我正在寻找一种通过 SockJS 发送二进制数据的方法。
    • 您为什么要特别通过 SockJS 传输二进制数据,您是想支持旧浏览器还是其他原因?
    • 是的,我不想自己实现后备选项。
    • 你能查一下Atmosphere吗?我认为,它可以替代 sockjs。它还支持后备方案。
    • 是的,这是我探索的第一件事,但我无法根据需要对其进行自定义。可能是我没有正确使用它,但不知何故我感觉不舒服。
    猜你喜欢
    • 2017-06-05
    • 2018-11-07
    • 1970-01-01
    • 2016-11-09
    • 2016-07-04
    • 1970-01-01
    • 2018-02-21
    • 2017-10-04
    • 2017-08-06
    相关资源
    最近更新 更多