Мы разрабатываем приложение чата с использованием 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) Веб-сокет отключен:операция не может быть завершена.
Любая помощь очень ценится.Заранее спасибо.