通过Sockjs + Spring Websocket + Stomp发送图像/文件

21

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

我需要支持在消息中发送文件。

根据这个问题,sockjs不支持二进制数据,但STOMP支持。

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

我有几个问题:

1)有没有一种绕过sockjs + stomp发送图像/文件的方法,或者转换为Base64是唯一的方法?

2)也许这是一个非常愚蠢的问题,但根据这个问题,可以通过STOMP(不使用sockjs)发送二进制数据。支持无sockjs的回退有多难?

谢谢。

编辑:如果只能使用base64,则我宁愿发起POST请求以保存具有附件的消息,而不是使用base64编码。有什么更好的想法吗?

3个回答

7
任何 Web Socket 实现只要进行 base64 编码就可以处理二进制数据。这实际上是将二进制流序列化为字符串。所有套接字传输和包装器都可以处理字符串数据。任何 Java base64 实现都应该可以使用。
在浏览器端,现代浏览器原生支持 base64,可以使用 btoa()atob()。如果您需要支持旧版浏览器,可能需要使用 polyfill。
话虽如此,如果 Java 服务器只是在 Web 用户之间代理消息,则不需要在 Java 中解码图像,您只需将经过字符串编码的图像从一个套接字连接传递到另一个即可。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Karthik
我知道我们可以使用base64编码,但我正在寻找替代方案,因为这个应用程序有非常频繁的带附件消息。因此,不必要地使用base64会增加大小。 - Karthik
但它是否能够流式传输,或者只是在发送之前进行一次字符串编码?换句话说,使用WebSockets是否有效率? - Marc

0

我想你可能误解了我的问题,我不是在寻找支持二进制的东西,我正在寻找一种通过SockJS发送二进制数据的方法。 - Karthik
你为什么要通过SockJS传输二进制数据,是因为你想支持旧浏览器还是其他原因? - daimon
是的,我不想自己实现回退选项。 - Karthik
你能检查一下Atmosphere吗?我认为它可以作为sockjs的替代品,而且还支持回退方案。 - daimon
是的,那是我探索的第一件事,但我无法根据我的需求进行定制。也许我没有正确使用它,但我总觉得不太舒服。 - Karthik

0
另一种选择是仅使用WebRTC发送二进制图像。其中一个优点是这些消息将是纯点对点的。您只需要在Web应用程序中实现此功能,而不需要在后端实现。您就不需要为图像使用的带宽付费。不幸的是,IE不支持WebRTC。

这样做并不能解决问题,对吧?我必须将消息保存在服务器上。使用WebRTC无法进行离线消息传递。 - Karthik
是的。如果这不是实时应用程序,我不知道为什么要使用WebSockets发送二进制数据。如果您正在排队消息,则使用多部分上传更有意义。 - Martin
用户可以通过websocket连接与在线的不同用户聊天,如果他想向离线用户发送消息,我可以使用相同的websocket连接。客户端为什么要关心用户是否在线? - Karthik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接