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

标签 javascript spring websocket stomp spring-websocket

我能够在 spring documentation 之后通过 WebSockets 使用 STOMP 发送和接收 JSON .然而,在高速率下性能很差,所以我想分析一下二进制消息的使用。

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

发送

我使用带有必要代理中继的 SimpMessageTemplate 发送消息 - 请参阅 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

RX message string  3
RX message string  3

我尝试过的事情

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

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

  • 正在调试发送代码,据我所知,它似乎仍然是 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)));
}

我的问题

  • 这种技术组合能否实现这种方法?
  • 我是否遗漏了一些关键步骤?
  • 谁能给我指出一个工作示例

最佳答案

似乎 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)));
}

更新

  • SPR-12301已在 4.1.2 中交付,但仅添加了对接收二进制消息的支持
  • 提出 SPR-12475用于发送二进制消息

关于javascript - 是否可以使用 Spring-WebSockets 通过 WebSockets 通过 STOMP 发送二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26213819/

相关文章:

java - 使用 spring mvc 在 web 服务中公开 bean 时出现异常

java - 如何使用 Spring Autowire 编写 JUnit 测试?

java - 指定属性文件的 Java 路径

java - 基于注释的安全限制不适用于 Web 套接字触发的方法调用

java - 使用 Executor 和 WebSocket 的多线程

javascript - angularjs ng-repeat 实现滚动条

javascript - 使用范围 slider 更改 div 的高度

javascript - 在服务器端Groovy页面中访问客户端jquery变量

javascript - Web Api 2 登录和注册操作、JavaScript 问题

ajax - AJAX 与 Web Sockets 的往返时间