Javascript 是否可以使用Spring WebSockets通过WebSockets发送二进制数据?
我能够在WebSocket上发送和接收JSON。但是,在高速率下,性能很差,因此我希望分析二进制消息的使用Javascript 是否可以使用Spring WebSockets通过WebSockets发送二进制数据?,javascript,spring,websocket,stomp,spring-websocket,Javascript,Spring,Websocket,Stomp,Spring Websocket,我能够在WebSocket上发送和接收JSON。但是,在高速率下,性能很差,因此我希望分析二进制消息的使用 弹簧腹板套4.0 在Chrome35中运行的JavaScript客户端 发送 我使用SimpMessageTemplate和必要的代理中继发送消息-请参阅 消息以字符串形式接收,控制台输出如下。我在等一些原始类型的,比如 我尝试过的事情 我意识到STOMP中的T代表文本,但是Spring文档暗示二进制消息至少在普通WebSocket中是可能的,状态也是如此 STOMP是基于文本的,但
- 弹簧腹板套4.0
- 在Chrome35中运行的JavaScript客户端
- 正在调试发送代码,就我所见,它似乎一直保持为byte[]
- 在接收时调试stomp.js库。在底层ws.onmessage回调(stomp-1.7.1.js中的第243行)中接收到的消息似乎是一个字符串
- 大量搜索-这似乎是一个很少有信息的话题
- 查看stomp.js源代码。对二进制文件的唯一引用是ws.binaryType=“arraybuffer”
message=MessageBuilder.withPayload(message.getPayload()).setHeaders(headers.build();
byte[]bytes=此.stompEncoder.encode((消息)消息);
已同步(会话){
sendMessage(新文本消息(新字符串(字节,UTF8_字符集));
}
我的问题
- 这种技术组合是否可能实现这种方法李>
- 我是否错过了关键的一步
- 有人能给我举一个有效的例子吗
ByteArrayMessageConverter来配置服务器
:
@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
messageConverters.add(new ByteArrayMessageConverter());
return false;
}
}
从跺脚规范的另一侧:
STOMP消息的正文必须是字符串。如果要发送和接收JSON对象
根据阵列缓冲区:
@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
messageConverters.add(new ByteArrayMessageConverter());
return false;
}
}
从现有数据获取数组缓冲区
- 从Base64字符串
- 从本地文件
因此,我认为您没有chioce,而是提供了一些定制的MessageConverter
,它将字节[]
转换为Base64字符串并发送
在JavaScript方面,您应该以某种方式将该字符串解码为ArrayBuffer
。似乎org.springframework.web.socket.TextMessage总是在org.springframework.web.socket.messaging.stompsubtocolHandler中使用,而不是在org.springframework.web.socket.BinaryMessage中使用。我已经为此提出了一个功能请求,该请求已被接受
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)));
}
message=MessageBuilder.withPayload(message.getPayload()).setHeaders(headers.build();
byte[]bytes=此.stompEncoder.encode((消息)消息);
已同步(会话){
sendMessage(新文本消息(新字符串(字节,UTF8_字符集));
}
更新
- 已在4.1.2中提供,但仅增加了对接收二进制消息的支持
- 为发送二进制消息而引发
谢谢你的建议。我试过了,但它不能解决问题。我已经对它进行了调试,创建了config类并调用了configureMessageConverters。我已经尝试在ByteArrayMessageConverter.supports、convertFromInternal和convertToInternal上设置中断,但是这些方法都没有被调用,即使它仍然能够发送到客户端!-是的,我肯定处于调试模式。在回答中添加了更多信息:“STOMP基于文本,但也允许传输二进制消息。”-标题后面可以是二进制数据,在这种情况下,标题必须指定内容长度。(github的官方规范中没有提到JSON)您可以发布Stomp帧头吗?它是哪个消息代理?我们是否仍然有与上面相同的解决方案来使用Stomp over websocket发送二进制数据(没有sockjs)?
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)));
}
@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;
}
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)));
}