“在收到握手响应之前连接已关闭”尝试使用 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 连接时的主要内容,如果未能解决你的问题,请参考以下文章
SharePoint 2010:尝试使用电源外壳安装 Web 部件时出现问题
尝试使用 npm 安装 web3 时找不到 web3/dist/web3.min.js