WebSocket 客户端无法使用不同端口连接到 Java spring WebSocket 服务器

thu*_*mon 4 java websocket spring-boot spring-websocket

我正在使用 Java Spring WebSocket 创建一个 WebSocket 服务器,如果从同一服务器创建 WebSocket 客户端,它实际上可以工作。

这是我的服务器端代码,非常简单

// WebSocketConfig.java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer  {
    @Autowired
    SocketTextHandler socketTextHandler;

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(socketTextHandler, "/sockets");
    }
    
}
Run Code Online (Sandbox Code Playgroud)
// SocketTextHandler.java
@Component
public class SocketTextHandler extends TextWebSocketHandler {
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message)
            throws InterruptedException, IOException {
        String payload = message.getPayload();
        System.out.println("16: " + session.getId());
        session.sendMessage(new TextMessage("Resp: " + payload));
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) {
        System.out.println("Server transport error: " + exception.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将以下WebSocket客户端放入Spring boot静态index.html中

<html>
  <body>
    Hello
    <script>
      console.log('start');
      const ws = new WebSocket('ws://localhost:8080/sockets');
      ws.onopen = function(evt) {
        console.log('onopen', evt);
      }
      ws.onerror = function(evt) {
        console.log('onerror', evt);
      }
      console.log('done');
   </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后我访问http://localhost:8080/index.html,没有错误,可以看到console.log('onopen', evt)日志。

但是,我的WebSocket客户端应该运行在不同的端口上http://localhost:3000,我使用相同的index.html,但是当我访问时,控制台中http://localhost:3000/index.html总是出现此错误WebSocket connection to 'ws://localhost:8080/sockets' failed

我想知道 WebSocket 是否需要从同一服务器连接?或者我错过了什么。

谢谢!

thu*_*mon 6

对于也遇到此问题的任何人,registry.addHandler(socketTextHandler, "/sockets").setAllowedOrigins("*");将解决该问题