我试图使用Websockets连接一个Angular应用和一个Spring应用。当我试图通过Angular应用进行连接时,我得到了以下错误。
WebSocket connection to 'ws:localhost:8071/websocket'
failed: Connection closed before recieving a handshake response
注意:我使用Docker..: 我使用的是Docker...
我似乎找不到问题出在哪里。我测试了以下事情。
我想这也许是由不同的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()) + "!");
}
找到了答案,我得到了2个问题,第一个问题是,当试图连接到Spring应用程序时,服务器会以某种方式将其转发到RabbitMQ服务。这样看起来我只能连接到rabbitMQ。