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

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是基于文本的,但

我能够在WebSocket上发送和接收JSON。但是,在高速率下,性能很差,因此我希望分析二进制消息的使用

  • 弹簧腹板套4.0
  • 在Chrome35中运行的JavaScript客户端
发送 我使用SimpMessageTemplate和必要的代理中继发送消息-请参阅

消息以字符串形式接收,控制台输出如下。我在等一些原始类型的,比如

我尝试过的事情 我意识到STOMP中的T代表文本,但是Spring文档暗示二进制消息至少在普通WebSocket中是可能的,状态也是如此

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.BinaryMessage。我已为此提出了一个功能请求

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