Spring stomp android web sockets客户端

Spring stomp android web sockets客户端,android,websocket,push-notification,spring-boot,stomp,Android,Websocket,Push Notification,Spring Boot,Stomp,有人能告诉我如何从android客户端连接到SpringStompWebSocket吗 WebSocketConfig.java import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotat

有人能告诉我如何从android客户端连接到SpringStompWebSocket吗

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客户端来连接这个套接字和主题。
提前谢谢

我也在讨论同样的问题。我发现spring提供了默认的web套接字连接器库,我用它来测试服务器端的代码

@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");
    }
@LocalServerPort
专用int端口;
私有SockJsClient-SockJsClient;
私有WebSocketStompClient stompClient;
私有最终WebSocketHttpHeaders headers=新WebSocketHttpHeaders();
@以前
公共作废设置(){
List transports=new ArrayList();
添加(新WebSocketTransport(新标准WebSocketClient());
this.sockJsClient=新的sockJsClient(传输);
this.stompClient=newwebsocketstompclient(sockJsClient);
this.stompClient.setMessageConverter(新的MappingJackson2MessageConverter());
}
@试验
public void getGreeting()引发异常{
最终倒计时闩锁=新倒计时闩锁(1);
最终AtomicReference失败=新的AtomicReference();
StompSessionHandler=新TestSessionHandler(失败){
@凌驾
连接后公用无效(最后一次StompSession会话,StompHeaders connectedHeaders){
subscribe(“/user/testuser1/reply”,新的StompFrameHandler(){
@凌驾
公共类型getPayloadType(StompHeaders){
返回问候语。课堂;
}
@凌驾
public void handleFrame(StompHeaders、对象有效负载){
MessageSendDTO问候语=(MessageSendDTO)有效负载;
试一试{
System.out.println(“######################+问候语.getWriter());
assertEquals(“testuser1”,greeting.getWriter());
}捕获(可丢弃的t){
失败。设置(t);
}最后{
session.disconnect();
倒计时();
}
}
});
试一试{
MessageSendDTO dto=新建MessageSendDTO();
dto.setWriter(“testuser1”);
dto.setReceiver(“testuser2”);
dto.setMessageBody(“测试”);
GsonBuilder=新的GsonBuilder();
Gson Gson=builder.create();
//session.send(“/app/newMessage”,新HelloMessage(“Spring”));
发送(“/app/newMessage”,dto);
}捕获(可丢弃的t){
失败。设置(t);
倒计时();
}
}
};
this.stompClient.connect(“ws://localhost:8080/newMessage”、this.headers、handler、this.port);
if(锁存等待(20,时间单位秒)){
if(failure.get()!=null){
抛出新的断言错误(“,failure.get());
}
}
否则{
失败(“未收到问候语”);
}

这段代码很好用。你只需稍加修改,就可以在android上使用它,所有的依赖项都可以从下载。

这个问题已经问了很久了,但它出现在谷歌上,还没有收到任何可接受的答案,因此

  • 这可以通过使用以下库轻松实现
  • 重要提示:哪些文档无法有效沟通: 在
    SockJS
    的情况下,让我们假设我们必须像
    http://server-host:8080/stompEndpoint
    但在android中,它必须是
    ws://server-host:8080/stompEndpoint/websocket
    。其中的差异是1)
    http
    vs
    ws
    2)附加在URL的android变体中
    /websocket

嗨,Pratap,我面临着类似的问题。你能告诉我你是如何解决这个问题的吗?谢谢!@programmerX我们没有使用这种方法,而是使用RabbitMQ来实现android设备的推送通知谢谢你的输入!@Pratap。不过我得到了解决方案,仅供参考,请参阅@programmerX当然!!我会看一看的