Я пытаюсь подключить приложение Angular к приложению Spring с помощью Websockets. При попытке подключиться через приложение Angular я получаю следующую ошибку:
WebSocket connection to 'ws:localhost:8071/websocket'
failed: Connection closed before recieving a handshake response
примечание: Я использую Docker ..
Я не могу кажется, нашел, в чем проблема. Я протестировал следующие вещи:
- Проверено, может ли приложение Angular подключаться к серверу websocket (используется: https://www.websocket.org/echo.html) Это сработало
- Проверено если приложение Angular может подключиться к RabbitMQ. (используется протокол STOMP 1.1) Это сработало.
- Проверено, может ли приложение Spring подключаться к RabbitMQ. (использовался протокол STOMP 1.2) Это сработало.
- Проверено, может ли приложение Spring подключаться к настраиваемой странице HTML. Это сработало.
- Проверено, может ли приложение Angular подключаться к приложению Spring. Это не сработало.
Я подумал, что это может быть вызвано разными протоколами STOMP, или, может быть, я сделал что-то не так в файле docker. Если нужен код, дайте мне знать, я предоставлю.
Docker -составить (соответствующая часть)
version: '3'
services:
frontend:
build: ./smilei-frontend
ports:
- 8070:80
websocket-server:
build: ./smilei_gateway/websocket-server
ports:
- 8071:8071
image: websocket
depends_on:
- eureka
- rabbitmq
environment:
- EUREKA_URI=http://eureka:8761/eureka
- BROKER_RELAY_HOST=rabbitmq
Angular приложение
connect() {
// connect to stomp where stomp endpoint is exposed
const socket = new WebSocket('ws://localhost:8071');
this.ws = Stomp.over(socket);
const that = this;
this.ws.connect({}, function(frame) {
that.ws.subscribe('/errors', function(message) {
alert('Error ' + message.body);
});
that.ws.subscribe('/user/topic/greetings', function(message) {
console.log("HALLO " + message)
//that.showGreeting(message.body);
});
that.disabled = true;
}, function(error) {
alert('STOMP error ' + error);
});
}
disconnect() {
if (this.ws != null) {
this.ws.ws.close();
}
this.setConnected(false);
console.log('Disconnected');
}
Приложение Spring
@Controller
public class WebsocketController {
private static final Logger LOGGER = LoggerFactory.getLogger(WebsocketController.class);
private static final Random RANDOM = new Random();
private final SimpMessagingTemplate simpMessagingTemplate;
private final GreetingService greetingService;
@Value("${server.port}")
private String port;
@Autowired
public WebsocketController(SimpMessagingTemplate simpMessagingTemplate, GreetingService greetingService) {
this.simpMessagingTemplate = simpMessagingTemplate;
this.greetingService = greetingService;
}
@MessageMapping("/hello")
@SendToUser("/topic/greetings") // use @SendToUser instead of @SendTo
public Greeting greeting(HelloMessage message, Principal principal) throws Exception {
LOGGER.info("Received greeting message {} from {}", message, principal.getName());
greetingService.addUserName(principal.getName()); // store UUID
Thread.sleep(1000); // simulated delay
return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}