2015-05-27 2 views
3

Согласно (Is it possible to send binary data with STOMP over WebSockets using Spring-WebSockets?), представляется возможным отправлять бинарные сообщения с помощью STOMP через веб-сайты.Отправка двоичного сообщения из java WebSocketStompClient

я настроил WebSocketStompClient следующим образом:

List<Transport> transports = new ArrayList<>(1); 
transports.add(new WebSocketTransport(new StandardWebSocketClient())); 
WebSocketClient transport = new SockJsClient(transports); 
WebSocketStompClient stompClient = new WebSocketStompClient(transport); 
// using a custom converter to serialize java object to byte[] 
stompClient.setMessageConverter(new SerializedJavaObjectMessageConverter()); 

Я использую следующий отправить сообщение:

StompHeaders stompHeaders = new StompHeaders(); 
stompHeaders.setDestination("/app/greetings"); 
stompHeaders.setContentType(MimeTypeUtils.APPLICATION_OCTET_STREAM); 
session.send(stompHeaders, new Greeting(message)); 

я получаю исключение из следующего утверждения:

Assert.isInstanceOf(TextMessage.class, message, this + " supports text messages only."); 

найдено в org.springframework.web.socket.sockjs.client.AbstractClientSockJs (ниже), которые o олько появляется для поддержки TextMessage:

@Override 
public final void sendMessage(WebSocketMessage<?> message) throws IOException { 
    Assert.state(State.OPEN.equals(this.state), this + " is not open, current state=" + this.state); 
    Assert.isInstanceOf(TextMessage.class, message, this + " supports text messages only."); 
    String payload = ((TextMessage) message).getPayload(); 
    payload = getMessageCodec().encode(new String[] { payload }); 
    payload = payload.substring(1); // the client-side doesn't need message framing (letter "a") 
    message = new TextMessage(payload); 
    if (logger.isTraceEnabled()) { 
      logger.trace("Sending message " + message + " in " + this); 
    } 
    sendInternal((TextMessage) message); 
} 

ли новый клиент Java WebSocketStompClient (4,2-СНАПШОТ), выполненный, как указано выше (т.е. используя SockJS для резервного копирования) поддерживают отправку двоичных сообщений?

UPDATE:

Следующая конфигурация клиент работает:

WebSocketClient transport = new StandardWebSocketClient(); 
WebSocketStompClient stompClient = new WebSocketStompClient(transport) 
+0

Не могли бы вы уточнить, в чем ваш вопрос? –

+0

@QPaysTaxes - В соответствии с вашим комментарием я переформулировал вопрос. – stacktrace

+0

Согласно комментариям Rossen Stoyanchev на https://jira.spring.io/browse/SPR-12301, SockJs не поддерживает двоичные сообщения (https://github.com/sockjs/sockjs-protocol/issues?q= это% 3Aopen + является% 3Aissue + двоичный) – stacktrace

ответ

1

Я был в состоянии получить эту работу, отправив TextMessage вместо этого. Я создал другой пользовательский MessageConverter, который Base64 кодирует/декодирует сериализованный объект:

public class Base64JavaObjectMessageConverter extends AbstractMessageConverter { 

    public Base64JavaObjectMessageConverter() { 
     super(MimeTypeUtils.TEXT_PLAIN); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     return true; 
    } 

    @Override 
    public Object convertFromInternal(Message<?> message, Class<?> targetClass) { 
     byte[] messageBytes = Base64.getDecoder().decode((byte[])message.getPayload()); 
     return SerializationUtils.deserialize(messageBytes ); 
    } 

    @Override 
    public Object convertToInternal(Object payload, MessageHeaders headers) { 
     byte[] messageBytes = SerializationUtils.serialize(payload); 
     return Base64.getEncoder().encode(messageBytes); 
    } 

} 
Смежные вопросы