我可以在spring documentation之后通过WebSockets发送和接收带有STOMP的JSON。但是,在高速率的情况下性能很差,所以我希望描述二进制消息的使用。
我使用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代表Text,但是Spring文档意味着二进制消息至少可以使用普通WebSockets,stomp specification状态
STOMP是基于文本的,但也允许传输二进制文件 消息。
更新:我在服务器端做了更多的调试。似乎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)));
}
答案 0 :(得分: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)));
}
更新
答案 1 :(得分:1)
尝试使用ByteArrayMessageConverter
:
@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
messageConverters.add(new ByteArrayMessageConverter());
return false;
}
}
<强>更新强>
啊!我看到。感谢:
public TextMessage(byte[] payload) {
super(new String(payload, UTF_8));
this.bytes = payload;
}
来自STOMP规范的另一面:
STOMP消息的主体必须是String。如果要发送和接收JSON对象,...
根据ArrayBuffer
:
从现有数据中获取数组缓冲区
- 来自Base64字符串
- 来自本地档案
所以,我认为你没有chioce而不是提供一些自定义MessageConverter
,它会将你的byte[]
转换为Base64字符串并发送它。
在JavaScript方面,您应该以某种方式将该字符串解码为ArrayBuffer
。