是否可以使用Spring-WebSockets通过WebSockets通过STOMP发送二进制数据?

Ada*_*dam 9 javascript spring stomp websocket spring-websocket

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

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

发出

我使用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);
   }
}
Run Code Online (Sandbox Code Playgroud)

接收

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

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

收到消息,但作为字符串,控制台输出如下.我期待一些原始类型,比如ArrayBuffer

RX message string  3
RX message string  3
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情

我实现了STOMP T代表文本,但是Spring文档意味着二进制消息可能至少与普通的WebSockets,也蹬规范状态

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

  • 调试发送代码,就我所见,它似乎保持为byte []
  • 在接收时调试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的功能要求

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)));
}
Run Code Online (Sandbox Code Playgroud)

我的问题

  • 这种混合技术可以采用这种方法吗?
  • 我错过了一些关键步骤吗?
  • 任何人都可以向我指出一个有效的例子

Ada*_*dam 9

看来org.springframework.web.socket.TextMessage总是在org.springframework.web.socket.messaging.StompSubProtocolHandler而不是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)));
}
Run Code Online (Sandbox Code Playgroud)

更新

  • SPR-12301在4.1.2中提供,但仅添加了对接收二进制消息的支持
  • 引发SPR-12475发送二进制消息