我们正在使用Spring Boot WebSocket开发一个Chat应用程序 . 用户可以登录聊天应用程序,托管在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) {
}
};
}
}
///////////////////////////////////////////
// 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 Client side code
///////////////////////////////////////////
let host = "xxx.xxx.x.xx:8080/tracking"
let socket = WebSocket(url: URL(string: "wss://\(host)/")!, protocols:[])
socket.delegate = self
socket.connect()
func websocketDidConnect(socket: WebSocketClient) {
print("websocket is connected")
}
func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
if let e = error as? WSError {
print("websocket is disconnected: \(e.message)")
} else if let e = error {
print("websocket is disconnected: \(e.localizedDescription)")
} else {
print("websocket disconnected")
}
}
func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
print("Received text: \(text)")
}
func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
print("Received data: \(data.count)")
}
当我们尝试从iOS连接时(在上面的代码片段中提供),我们收到以下错误:TCP Conn 0x109de3d50 SSLHandshake失败(-9847)websocket断开连接:操作无法完成 .
任何帮助深表感谢 . 提前致谢 .