Как подключиться к серверу Spring WebSocket из клиента IOS? - PullRequest
0 голосов
/ 03 декабря 2018

Мы разрабатываем приложение чата с использованием Spring Boot WebSocket.Пользователи могут войти в приложение чата, размещенное в Tomcat, и отправлять сообщения другим онлайн-пользователям.Мы не можем подключиться с другого клиента iOS к тому же приложению чата.

Ниже приведена наша реализация кода на сервере и клиенте

///////////////////////////////////////////
// Server side implementation
///////////////////////////////////////////

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

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

@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {

    private final Logger log = LoggerFactory
            .getLogger(WebsocketConfiguration.class);

    public static final String IP_ADDRESS = "IP_ADDRESS";

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        log.debug("registering StompEndpoints");
        registry.addEndpoint("/websocket/tracker")
                .setHandshakeHandler(new DefaultHandshakeHandler() {
                    // custom authentication 
                }).withSockJS()
                .setInterceptors(httpSessionHandshakeInterceptor());
    }

    @Bean
    public HandshakeInterceptor httpSessionHandshakeInterceptor() {
        return new HandshakeInterceptor() {

            @Override
            public boolean beforeHandshake(ServerHttpRequest request,
                    ServerHttpResponse response, WebSocketHandler wsHandler,
                    Map<String, Object> attributes) throws Exception {
                if (request instanceof ServletServerHttpRequest) {
                    ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
                    attributes.put(IP_ADDRESS,
                            servletRequest.getRemoteAddress());
                }
                return true;
            }

            @Override
            public void afterHandshake(ServerHttpRequest request,
                    ServerHttpResponse response, WebSocketHandler wsHandler,
                    Exception exception) {

            }
        };
    }
}

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>    ///////////////////////////////////////////
    // Web Client side socket creation code 
    ///////////////////////////////////////////

    var stompClient = null;
    function connect() {

    	if (stompClient != null) {
    		stompClient.disconnect();
    	}

    	var socket = new SockJS(contextPath + '/tracking');
    	stompClient = Stomp.over(socket);
    	stompClient.connect({}, function(frame) {
    		stompClient.subscribe('/message/send/individual/' + loginUserUk,
    				function(response) {
    					var messageBody1 = JSON.parse(response.body);
    					//process with the response

    				});
    	});
    }
///////////////////////////////////////////// // Клиентский код IOS /////////////////////////////////////////// let host = "xxx.xxx.x.xx: 8080 / tracking"let socket = WebSocket (url: URL (строка: "wss: // \ (host) /") !, протоколы: []) socket.delegate = self socket.connect () func websocketDidConnect (socket: WebSocketClient) {print ("websocket подключен")} func websocketDidDisconnect (сокет: WebSocketClient, ошибка: ошибка?) {если пусть e = ошибка как?WSError {print ("websocket отключен: \ (e.message)")} else если let e = error {print ("websocket отключен: \ (e.localizedDescription)")} else {print ("websocket отключен")}} func websocketDidReceiveMessage (socket: WebSocketClient, text: String) {print ("Полученный текст: \ (text)")} func websocketDidReceiveData (socket: WebSocketClient, data: Data) {print ("Полученные данные: \ (data.count")) ")}

Когда мы пытаемся подключиться с iOS (предоставлено в приведенном выше фрагменте кода), мы получаем следующую ошибку: TCP Conn 0x109de3d50 Сбой SSLHandshake (-9847) Веб-сокет отключен:операция не может быть завершена.

Любая помощь очень ценится.Заранее спасибо.

1 Ответ

0 голосов
/ 10 января 2019

Я думаю, что проблема связана с URL, который вы используете из клиента iOS.Websocket работает поверх HTTP, где клиент и сервер обмениваются данными по TCP после установления HTTP-соединения.

Когда вы подключаете клиента из браузера, все, что вы делаете, это инициируете HTTP-запрос.Как только сервер подтверждает запрос, он устанавливает TCP-соединение с клиентским браузером.Здесь вы используете SockJS (contextPath + '/ tracking');чтобы отправить сообщение через уровень TCP.

Чтобы подключить ваш iOS-клиент к тому же серверу, все, что вам нужно сделать, это отправить HTTP-запрос, а не тот, что с "wss:".Пока вы отправляете запрос с правильной конечной точкой от клиента iOS, у вас все будет хорошо.

 let host = "xxx.xxx.x.xx:8080/tracking"
       let socket = WebSocket(url: URL(string: "http://\(host)/")!, protocols:[])
            socket.delegate = self
            socket.connect()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...