在使用websockets连接Angular和Spring时,"在收到握手响应前连接关闭"。

问题描述 投票:0回答:1

我试图使用Websockets连接一个Angular应用和一个Spring应用。当我试图通过Angular应用进行连接时,我得到了以下错误。

WebSocket connection to 'ws:localhost:8071/websocket' 
failed: Connection closed before recieving a handshake response

注意:我使用Docker..: 我使用的是Docker...

我似乎找不到问题出在哪里。我测试了以下事情。

  • 测试了Angular应用是否能与websocket服务器连接(使用了:https:/)。https:/www.websocket.orgecho.html)这工作
  • 测试了Angular应用是否能与RabbitMQ连接。(使用STOMP 1.1协议)这项工作。
  • 测试Spring应用程序是否可以与RabbitMQ连接。(使用STOMP 1.2协议)这项工作有效。
  • 测试Spring应用程序是否可以与自定义的HTML页面连接。此项工作正常。
  • 测试Angular应用程序是否可以与Spring应用程序连接。这没有工作。

我想这也许是由不同的STOMP协议引起的,或者也许我在docker文件中做错了什么。如果需要代码告诉我,我会提供。

Docker-compose (有关部分)

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');
}

春季应用

@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()) + "!");
}
angular spring docker websocket
1个回答
0
投票

找到了答案,我得到了2个问题,第一个问题是,当试图连接到Spring应用程序时,服务器会以某种方式将其转发到RabbitMQ服务。这样看起来我只能连接到rabbitMQ。

© www.soinside.com 2019 - 2024. All rights reserved.