Клиент веб-сокетов Spring Stomp для Android

Может кто-нибудь, дайте мне знать, как подключиться к веб-сокету Spring Stomp из клиента Android.

WebSocketConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/pushticket");
        config.setApplicationDestinationPrefixes("/rest");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ticket").withSockJS();
    }

}

PushMessageNotifier.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;    

@Service
@EnableAsync
public class PushMessageNotifier {

    private SimpMessagingTemplate simpMessagingTemplate;

    @Autowired
    public PushMessageNotifier(SimpMessagingTemplate simpMessagingTemplate) {
        this.simpMessagingTemplate = simpMessagingTemplate;
    }

    @Async
    public Boolean pushToUI(TicketView ticketView) {
        Boolean result = false;
        if (null != ticketView) {
            this.simpMessagingTemplate.convertAndSend("/pushticket/ticket", ticketView);
            result = true;
        }
        return result;
    }

}

Подскажите, пожалуйста, как я могу подключиться к этой розетке из приложения android? Даже я не знаю, какой клиент Android мне нужно использовать для подключения к этому сокету и теме. заранее спасибо


person Pratap A.K    schedule 03.12.2015    source источник
comment
Привет, Пратап, я столкнулся с похожей проблемой ... не могли бы вы рассказать мне, как вы решили эту проблему? Благодарность!   -  person NotABot    schedule 10.07.2019
comment
@programmerX Мы не использовали этот подход, вместо этого мы использовали RabbitMQ для получения push-уведомлений для устройств Android.   -  person Pratap A.K    schedule 12.07.2019
comment
Спасибо за вклад! @Pratap. У меня есть решение, к вашему сведению, обратитесь к этому stackoverflow.com/a/56970860/5576205   -  person NotABot    schedule 12.07.2019
comment
@programmerX конечно !! я взгляну   -  person Pratap A.K    schedule 15.07.2019


Ответы (2)


Прошло много времени с тех пор, как вопрос был задан, но он появляется в Google и поэтому не получил никакого принятого ответа ...

  • этого легко добиться с помощью следующей библиотеки https://github.com/NaikSoftware/StompProtocolAndroid
  • Важное примечание: какая документация не может эффективно взаимодействовать: в случае SockJS предположим, что мы должны использовать URL как http://server-host:8080/stompEndpoint, но в Android он должен быть ws://server-host:8080/stompEndpoint/websocket. Где различия: 1) http vs ws 2) Добавлен /websocket в варианте URL для Android
person NotABot    schedule 10.07.2019

У меня была такая же проблема. Я обнаружил, что spring предоставляет библиотеку соединителей веб-сокетов по умолчанию, которую я использовал для тестирования своего кода на стороне сервера.

@LocalServerPort
private int port;

private SockJsClient sockJsClient;

private WebSocketStompClient stompClient;

private final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();

@Before
public void setup() {
    List<Transport> transports = new ArrayList<>();
    transports.add(new WebSocketTransport(new StandardWebSocketClient()));
    this.sockJsClient = new SockJsClient(transports);

    this.stompClient = new WebSocketStompClient(sockJsClient);
    this.stompClient.setMessageConverter(new MappingJackson2MessageConverter());
}

@Test
public void getGreeting() throws Exception {

    final CountDownLatch latch = new CountDownLatch(1);
    final AtomicReference<Throwable> failure = new AtomicReference<>();

    StompSessionHandler handler = new TestSessionHandler(failure) {

        @Override
        public void afterConnected(final StompSession session, StompHeaders connectedHeaders) {
            session.subscribe("/user/testuser1/reply", new StompFrameHandler() {
                @Override
                public Type getPayloadType(StompHeaders headers) {
                    return Greeting.class;
                }

                @Override
                public void handleFrame(StompHeaders headers, Object payload) {
                    MessageSendDTO greeting = (MessageSendDTO) payload;
                    try {
                        System.out.println("#################### "+greeting.getWriter());
                        assertEquals("testuser1", greeting.getWriter());
                    } catch (Throwable t) {
                        failure.set(t);
                    } finally {
                        session.disconnect();
                        latch.countDown();
                    }
                }
            });
            try {

                MessageSendDTO dto= new MessageSendDTO();
                dto.setWriter("testuser1");
                dto.setReceiver("testuser2");
                dto.setMessageBody("TESTING ");

                GsonBuilder builder = new GsonBuilder();
                Gson gson = builder.create();

               //session.send("/app/newMessage", new HelloMessage("Spring"));
                session.send("/app/newMessage", dto);
            } catch (Throwable t) {
                failure.set(t);
                latch.countDown();
            }
        }
    };

    this.stompClient.connect("ws://localhost:8080/newMessage", this.headers, handler, this.port);

    if (latch.await(20, TimeUnit.SECONDS)) {
        if (failure.get() != null) {
            throw new AssertionError("", failure.get());
        }
    }
    else {
        fail("Greeting not received");
    }

Этот код работает нормально. Вы можете использовать это для своего Android с небольшими изменениями, и все зависимости для этого можно загрузить с здесь.

person Abdullah Al Noman    schedule 04.01.2017