[SPRING] Spring-WebSockets을 사용하여 WebSocket을 통해 STOMP를 사용하여 바이너리 데이터를 보낼 수 있습니까?
SPRINGSpring-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.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.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에 디코딩해야합니다.
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
'SPRING' 카테고리의 다른 글
[SPRING] 다중 스레드 웹 응용 프로그램에서 요청 범위 Bean에 액세스 (0) | 2019.02.08 |
---|---|
[SPRING] 봄 MVC에서 다중보기 확인 자 (0) | 2019.02.08 |
[SPRING] Java는 변경 가능성을 보여줍니다. (0) | 2019.02.08 |
[SPRING] 기존 webapp의 스프링 부트 상태 확인 (0) | 2019.02.08 |
[SPRING] 내 WebContent 폴더에서 파일의 실제 경로를 얻으려면 어떻게합니까? (0) | 2019.02.08 |