当前位置: 首页 > 知识库问答 >
问题:

是否可以使用Spring WebSocket在WebSocket上通过STOMP发送二进制数据?

蓝苗宣
2023-03-14

在spring文档之后,我能够通过WebSockets通过STOMP发送和接收JSON。然而,在高速率下性能很差,因此我希望分析二进制消息的使用。

  • Spring腹板套筒4.0

我使用带有必要代理中继的SimpMessageTemplate发送消息-请参阅Spring留档

@Controller
public class DemoBinaryController {
   @Autowired
   private SimpMessagingtemplate template

   @Scheduled(fixedDelay = 5000)
   public void demo() throws Exception {
      GenericMessage<byte[]> message = new GenericMessage<byte[]>(new byte[]{65,66,67});
      template.send("/app/binarydemo", message);
   }
}

JavaScript客户端使用stomp接收数据。js使用标准机制。

var subscription = client.subscribe("/app/binarydemo", new function(message) {
   console.log("RX message", typeof message.body, message.body.length);
});

消息以字符串形式接收,控制台输出如下。我在期待一些原始类型,比如ArrayBuffer

RX message string  3
RX message string  3

我意识到STOMP中的T代表文本,然而Spring文档暗示二进制消息至少在普通websocket中是可能的,STOMP规范也指出了这一点

STOMP是基于文本的,但也允许传输二进制消息。

  • 调试发送代码,据我所知,它似乎保持为字节[]

更新:我在服务器端做了更多的调试。似乎org.springframework.web.socket.TextMessage总是在org.springframework.web.socket.messaging.StompSubPro colHandler中使用,而不是org.springframework.web.socket.BinaryMessage。我已经为这个SPR-12301提出了一个功能请求

message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();
byte[] bytes = this.stompEncoder.encode((Message<byte[]>) message);

synchronized(session) {
    session.sendMessage(new TextMessage(new String(bytes, UTF8_CHARSET)));
}
  • 这种技术组合是否可能实现这种方法?
  • 我错过了关键的一步吗?
  • 有谁能给我举一个有效的例子

共有2个答案

谭曦
2023-03-14

尝试仅使用ByteArrayMessageConverter配置您的服务器:

@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
   
   @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        messageConverters.add(new ByteArrayMessageConverter());
        return false;
    }

}

更新

啊!我明白了。谢谢:

public TextMessage(byte[] payload) {
    super(new String(payload, UTF_8));
    this.bytes = payload;
}

从STOMP规范的另一侧:

STOMP消息的正文必须是字符串。如果要发送和接收JSON对象。。。

根据ArrayBuffer:

从存量数据获取数组缓冲区

所以,我认为你没有一个方法,而不是为你提供一些自定义的MessageConverter,它将你的byte[]转换为Base64 String并发送它。

在JavaScript方面,您应该以某种方式将该字符串解码为ArrayBuffer

柴宏浚
2023-03-14

似乎是组织。springframework。网状物插座TextMessage始终在组织内使用。springframework。网状物插座消息传递。stompsubtocolhandler而不是org。springframework。网状物插座二进制消息。我已经为SPR-12301提出了一个功能请求,该请求已被接受。

message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();
byte[] bytes = this.stompEncoder.encode((Message<byte[]>) message);

synchronized(session) {
    session.sendMessage(new TextMessage(new String(bytes, UTF8_CHARSET)));
}

使现代化

  • SPR-12301在4.1.2中交付,但只增加了对接收二进制消息的支持
  • 提出SPR-12475用于发送二进制消息
 类似资料:
  • 我正在开发一个查看器应用程序,其中服务器捕获图像,执行一些图像处理操作,这需要在客户端显示在HTML5画布上。我写的服务器是在VC和使用http://www.codeproject.com/Articles/371188/A-Cplusplus-Websocket-server-for-realtime-interact. 到目前为止,我已经实现了所需的功能。现在我需要做的就是优化。引用是一个用来

  • 我正在开发一个应用程序,用户必须从列表中选择任意数量的国家,我必须通过多部分发送所选的名称。 但是,在所有的尝试中,我都得到了错误retrofit.retrofiterror:Part body不能为null。 我还提到,ChangeLog for refitfit提到“new:Support iterable and array参数使用OKHTTP的”,但是经过深入研究,我发现给定的示例相当混乱

  • 问题内容: 我正在尝试将HTTP POST发送到网络上的设备。不幸的是,我想将四个特定字节的数据发送到设备,但我似乎只能将字符串发送到设备。反正有使用JavaScript发送原始二进制文件吗? 这是我用来执行POST的脚本,除非我在数据字段中输入字符串,否则它目前不会运行。有任何想法吗? 问题答案: 默认情况下,jQuery序列化数据(传递的属性)-这意味着将 数字 作为“ 4244668417”

  • 我正在使用Spring webSocket(STOMP作为子协议)和Sockjs开发一个消息应用程序。 我应该提供支持在消息中发送文件。 根据这张票证,sockjs不支持二进制数据,但STOMP支持。 我知道我们可以将图像转换为base64并通过stomp发送,但我认为这不是最佳做法,因为转换和开销很大。我还必须保存消息,所以要在服务器上再次保存这个base64编码的文件,我必须对它们进行解码。

  • 问题内容: 我已经看到了许多在Java中通过套接字发送序列化数据的示例,但是我想要的只是发送一些简单的整数和字符串。而且,问题是我正在尝试将这些信息传递给用C编写的二进制文件。 因此,最重要的是:如何在Java中通过套接字发送一些字节? 问题答案: 我真的建议不要直接使用Java Sockets库。我发现Netty(来自JBoss)非常易于实现且功能强大。Netty ChannelBuffer类带

  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的