是否可以使用 Spring-WebSockets 通过 WebSockets 通过 STOMP 发送二进制数据? [英] Is it possible to send binary data with STOMP over WebSockets using Spring-WebSockets?

查看:46
本文介绍了是否可以使用 Spring-WebSockets 通过 WebSockets 通过 STOMP 发送二进制数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够按照 spring 文档.然而,在高速率下性能很差,所以我想分析一下二进制消息的使用.

I am able to send and receive JSON with STOMP over WebSockets following spring documentation. However performance is poor at large high rates, so I wish to profile the use of binary messages.

  • Spring-WebSockets 4.0
  • 在 Chrome 35 中运行的 JavaScript 客户端
  • stomp.js 1.7.1

我使用 SimpMessageTemplate 和必要的代理中继发送消息 - 参见 spring 文档

I send messages using SimpMessageTemplate with the necessary broker relay - see spring documentation

@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

Messages are received, but as Strings, with console output as follows. I'm expecting some raw type, like ArrayBuffer

RX message string  3
RX message string  3

我尝试过的事情

我意识到 STOMP 中的 T 代表文本,但是 Spring 文档暗示二进制消息至少可以使用普通的 WebSockets,还有 stomp 规范 状态

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

STOMP is text based but also allows for the transmission of binary messages.

  • 调试发送代码,就我所见,它似乎保留为字节 []
  • 在接收时调试 stomp.js 库.在底层 ws.onmessage 回调中接收到的消息似乎是一个字符串(stomp-1.7.1.js 中的第 243 行)
  • 大量搜索 - 这似乎是一个信息很少的罕见主题
  • 查看 stomp.js 源代码.对二进制的唯一引用是 ws.binaryType = "arraybuffer".
  • 更新:我在服务器端做了更多的调试.似乎 org.springframework.web.socket.TextMessage 总是在 org.springframework.web.socket.messaging.StompSubProtocolHandler 而不是 org.springframework.web.socket.BinaryMessage.我已经为此 SPR-12301

    Update: I've done more debugging on the server side. It seems that org.springframework.web.socket.TextMessage is always used within org.springframework.web.socket.messaging.StompSubProtocolHandler rather than org.springframework.web.socket.BinaryMessage. I've raised a feature request for this 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)));
    }
    

    我的问题

    • 这种技术组合是否可以实现这种方法?
    • 我是否遗漏了一些关键步骤?
    • 谁能告诉我一个可行的例子
    • 推荐答案

      org.springframework.web.socket.TextMessage 似乎总是在 org.springframework.web.socket.messaging.StompSubProtocolHandler 中使用,而不是在 org.springframework 中使用.web.socket.BinaryMessage.我已经为此 SPR-12301 提出了一个功能请求,该请求已被接受.>

      It seems that org.springframework.web.socket.TextMessage is always used within org.springframework.web.socket.messaging.StompSubProtocolHandler rather than org.springframework.web.socket.BinaryMessage. I've raised a feature request for this SPR-12301 which has been accepted.

      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 用于发送二进制消息
      • SPR-12301 was delivered in 4.1.2 but only adds support for receiving binary messages
      • Raised SPR-12475 for sending of binary messages

      这篇关于是否可以使用 Spring-WebSockets 通过 WebSockets 通过 STOMP 发送二进制数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆