«Соединение закрыто до получения ответа на рукопожатие» При попытке подключения Angular с помощью Spring с использованием веб-сокетов - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь подключить приложение 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()) + "!");
}

1 Ответ

0 голосов
/ 27 мая 2020

Нашел anwser, у меня было 2 проблемы, первая заключалась в том, что при попытке подключиться к приложению Spring сервер каким-то образом перенаправлял его в службу RabbitMQ. Таким образом, казалось, что я могу подключиться только к rabbitMQ.

...