在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);
}
}
接收
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 规范也指出
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)));
}
我的问题
- 这种技术组合是否可行?
- 我错过了一些关键步骤吗?
- 谁能指出我的工作示例