Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中连接到websocket_Java_Android_Spring Boot_Spring Websocket - Fatal编程技术网

Java 如何在Android中连接到websocket

Java 如何在Android中连接到websocket,java,android,spring-boot,spring-websocket,Java,Android,Spring Boot,Spring Websocket,我正在学习如何使用Android客户端在Spring-boot中使用WebSockets。我在Tinder捡到了Scarlet,它看起来像一个很棒的图书馆。我的问题是如何用scarlet调用我的websocket端点。我已经有了一个不断更新用户位置的工作示例springboot项目,下面是该项目 首先,我们有我们的messagebrokerWebSocketMessageBrokerConfigure public class WebSocketConfig implements WebSock

我正在学习如何使用
Android客户端
Spring-boot
中使用
WebSockets
。我在Tinder捡到了Scarlet,它看起来像一个很棒的图书馆。我的问题是如何用scarlet调用我的
websocket
端点。我已经有了一个不断更新用户位置的工作示例
springboot
项目,下面是该项目

首先,我们有我们的messagebroker
WebSocketMessageBrokerConfigure

public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app");
}

}
侦听连接/断开连接以及页面加载的侦听器

@Component

public class WebSocketEventListener {

private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);

@Autowired
private SimpMessageSendingOperations messagingTemplate;

//method called when user open page in browser
@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {
    logger.info("Received a new web socket connection");
}

//method called when user close page in browser
@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
    StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());

    String username = (String) headerAccessor.getSessionAttributes().get("username");
    if(username != null) {
        logger.info("User Disconnected : " + username);

        //remove user from latest Location Feed
        CommunicationController.latestLocationFeed.remove(username);

        //transmitting current user's latest location feed
        messagingTemplate.convertAndSend("/app/getData", new LocationBean());
    }
}
}
最后是我们的控制器,它基本上有一个端点,可以用订阅
/app/getData

public static Map<String, LocationBean> latestLocationFeed = new HashMap<String, LocationBean>();

@MessageMapping("/saveLocation") //for saving current user's location in memory
@SendTo("/app/getData") //for transmitting all connected user's latest location 
public List<LocationBean> saveLocation(@Payload LocationBean bean, SimpMessageHeaderAccessor headerAccessor) {
    //getting current user's location from web socket
    headerAccessor.getSessionAttributes().put("username", bean.getUser());
    logger.debug("\tUser:"+bean.getUser()+" >>> LocationBean:"+bean.toString());

    //unique user wise latest location feed set in-memory hash map
    latestLocationFeed.put(bean.getUser(), bean);

    //converting map to list
    Collection<LocationBean> values = latestLocationFeed.values();
    ArrayList<LocationBean> listOfValues = new ArrayList<LocationBean>(values);
    logger.info("\tPublicLocationFeed:"+listOfValues.toString());

    //send all user's latest location feed
    return listOfValues;
}
我像这样实现它

    OkHttpClient okHttpClient = new OkHttpClient
            .Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10,TimeUnit.SECONDS)
            .build();

    GdaxService scarletGdaxService = new Scarlet.Builder()
            //.lifecycle(this)
            .webSocketFactory(OkHttpClientUtils.newWebSocketFactory(okHttpClient, "ws://localhost:8080/ws/app/getData"))
            .addMessageAdapterFactory(new GsonMessageAdapter.Factory())
            .addStreamAdapterFactory(new RxJava2StreamAdapterFactory())
            .build()
            .create(GdaxService.class);



    scarletGdaxService.observeWebSocketEvent()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableSubscriber<WebSocket.Event>() {
                @Override
                public void onNext(WebSocket.Event event) {
                    Log.d(TAG, "Current socket connection status: "+event);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "Connection status flowable complete");
                }
            });
    scarletGdaxService.observeLocationChangedResponse()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableSubscriber<String>() {
                @Override
                public void onNext(String s) {
                    txtResponse.setText(s);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "Flowable has completed");
                }
            });
OkHttpClient-OkHttpClient=new-OkHttpClient
.Builder()
.connectTimeout(10,时间单位为秒)
.readTimeout(10,时间单位为秒)
.build();
GdaxService scarlettgdaxservice=new Scarlet.Builder()
//.生命周期(本)
.webSocketFactory(OkHttpClientUtils.newWebSocketFactory(okHttpClient,“ws://localhost:8080/ws/app/getData”))
.addMessageAdapterFactory(新的GsonMessageAdapter.Factory())
.addStreamAdapterFactory(新的RxJava2StreamAdapterFactory())
.build()
.create(GdaxService.class);
scarlettaxservice.observeWebSocketEvent()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新的可处置订户(){
@凌驾
public void onNext(WebSocket.Event){
日志d(标记“当前插座连接状态:+事件”);
}
@凌驾
公共作废登记员(可丢弃的t){
t、 printStackTrace();
}
@凌驾
未完成的公共空间(){
日志d(标签“连接状态可流动完成”);
}
});
scarletGdaxService.observeLocationChangedResponse()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新的可处置订户(){
@凌驾
public void onNext(字符串s){
txtResponse.setText(s);
}
@凌驾
公共作废登记员(可丢弃的t){
t、 printStackTrace();
}
@凌驾
未完成的公共空间(){
Log.d(标签“Flowable已完成”);
}
});
任何对如何在Android中复制我的web实现有经验的人都可以提供帮助

    OkHttpClient okHttpClient = new OkHttpClient
            .Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10,TimeUnit.SECONDS)
            .build();

    GdaxService scarletGdaxService = new Scarlet.Builder()
            //.lifecycle(this)
            .webSocketFactory(OkHttpClientUtils.newWebSocketFactory(okHttpClient, "ws://localhost:8080/ws/app/getData"))
            .addMessageAdapterFactory(new GsonMessageAdapter.Factory())
            .addStreamAdapterFactory(new RxJava2StreamAdapterFactory())
            .build()
            .create(GdaxService.class);



    scarletGdaxService.observeWebSocketEvent()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableSubscriber<WebSocket.Event>() {
                @Override
                public void onNext(WebSocket.Event event) {
                    Log.d(TAG, "Current socket connection status: "+event);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "Connection status flowable complete");
                }
            });
    scarletGdaxService.observeLocationChangedResponse()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableSubscriber<String>() {
                @Override
                public void onNext(String s) {
                    txtResponse.setText(s);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "Flowable has completed");
                }
            });