복붙노트

[SPRING] Spring-WebSockets을 사용하여 WebSocket을 통해 STOMP를 사용하여 바이너리 데이터를 보낼 수 있습니까?

SPRING

Spring-WebSockets을 사용하여 WebSocket을 통해 STOMP를 사용하여 바이너리 데이터를 보낼 수 있습니까?

스프링 문서에 따라 WebSocket을 통해 STOMP를 사용하여 JSON을 보내고받을 수 있습니다. 그러나 큰 비율로는 성능이 좋지 않으므로 바이너리 메시지의 사용을 프로파일하고 싶습니다.

필요한 중개인 릴레이가있는 SimpMessageTemplate을 사용하여 메시지를 보냅니다. 스프링 설명서를 참조하십시오.

@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 설명서에서는 적어도 일반 웹 소켓과 이진 메시지가 가능하다는 것을 의미합니다.

업데이트 : 나는 서버 측에서 더 많은 디버깅 작업을 수행했습니다. org.springframework.web.socket.TextMessage는 org.springframework.web.socket.BinaryMessage가 아닌 org.springframework.web.socket.messaging.StompSubProtocolHandler 내에서 항상 사용되는 것으로 보입니다. 이 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.org.springframework.web.socket.TextMessage는 org.springframework.web.socket.BinaryMessage가 아닌 org.springframework.web.socket.messaging.StompSubProtocolHandler 내에서 항상 사용되는 것으로 보입니다. 나는이 SPR-12301에 대한 기능 요청을 받아 들였습니다.

    org.springframework.web.socket.TextMessage는 org.springframework.web.socket.BinaryMessage가 아닌 org.springframework.web.socket.messaging.StompSubProtocolHandler 내에서 항상 사용되는 것으로 보입니다. 나는이 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)));
    }
    

    최신 정보

  2. ==============================

    2.ByteArrayMessageConverter를 사용하여 서버를 구성하십시오.

    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 사양의 다른 측면에서 :

    ArrayBuffer에 따르면 :

    그래서, 당신이 당신에게 byte []를 Base64 String으로 바꾸고 보내주는 커스텀 MessageConverter를 제공하기보다는 선택의 여지가 없다고 생각합니다.

    자바 스크립트 측면에서 그 문자열을 어떻게 든 ArrayBuffer에 디코딩해야합니다.

  3. from https://stackoverflow.com/questions/26213819/is-it-possible-to-send-binary-data-with-stomp-over-websockets-using-spring-webso by cc-by-sa and MIT license