“在收到握手响应之前连接已关闭”尝试使用 websockets 将 Angular 与 Spring 连接时

Posted

技术标签:

【中文标题】“在收到握手响应之前连接已关闭”尝试使用 websockets 将 Angular 与 Spring 连接时【英文标题】:"Connection closed before recieving a handshake response" When trying to connect Angular with Spring using websockets 【发布时间】:2020-05-27 13:46:21 【问题描述】:

我正在尝试使用 Websockets 将 Angular 应用程序与 Spring 应用程序连接起来。尝试通过 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-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()) + "!");

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于“在收到握手响应之前连接已关闭”尝试使用 websockets 将 Angular 与 Spring 连接时的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io - 失败:连接在收到握手响应之前关闭

SharePoint 2010:尝试使用电源外壳安装 Web 部件时出现问题

尝试使用 npm 安装 web3 时找不到 web3/dist/web3.min.js

尝试使用 symfony 创建 Web 服务时出现问题

尝试使用 php 和 curl 复制 Web 请求(图像上传)

Truffle testing - 尝试使用 web3 测试 EIP712,有没有其他选择?