- 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)));
}
我的问题
- 这种技术组合可以实现吗?
- 我是否漏掉了一些关键步骤?
- 有没有人能够提供一个可行的示例?