当连接到WebSocket时,我收到状态码200,但这是一个错误吗?

39

我的错误显示在浏览器的控制台中:

"WebSocket连接到'ws://localhost:32768/DspClusterWebServices/myHandler'失败:意外的响应代码:200"

我正在使用 Spring Websockets 4.1.5Tomcat 8.0.18。我的 WebSocketConfigurer 实现类如下:

@Configuration
@Controller
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer
{
   class MyHandler implements WebSocketHandler
   {
      @Override
      public void afterConnectionEstablished(WebSocketSession session) throws Exception
      {
         System.out.println("afterConntectionEstablished called");
      }

       ...implements rest of functions with a System.out.println and false for supportsPartialMessages()

      }
   }

   @Override registerWebSocketHandlers(WebSocketHandlerRegistry registry)
   {
      registry.addHandler(myHandler(), "myHandler").withSockJS();
   }

   @Bean
   public WebSocketHandler myHandler()
   {
      return new MyHandler();
   }
}

我的testWebsocketClient.js尝试使用以下代码连接,但出现错误码200:

websocket = new WebSocket("ws://localhost:8080/myApp/myHandler");

我不知道接下来该尝试什么。我以为这会触发afterConnectionEstablished(WebSocketSession session)方法?难道状态码200不好吗?


1
请看这个链接,https://dev59.com/BWUq5IYBdhLWcg3wXvWa#14555549,特别是其中的一句话:“至于你遇到的“意外响应代码:200”错误,我猜测你在客户端使用的WebSocket URL没有指向有效的服务器端脚本,但是如果没有更多信息,很难发表评论。” - xerx593
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - smuggledPancakes
控制器注释怎么样?(它不在WebSocket示例中)...你不觉得那可能会干扰吗? - xerx593
移除 @Controller 没有任何效果,我仍然得到了一个 200 的错误代码。 - smuggledPancakes
1
嗯...听起来不错:请尝试连接到 "ws://localhost:8080/myApp/myHandler/websocket"!? - xerx593
1
xerx593,请在回答中包含以下链接和此链接:https://github.com/spring-projects/spring-boot/issues/2586在我添加了websocket之后,它给了我一个错误“Failed to parse Origin header value [null]”,然后我找到了那个链接。我不得不在我的addHandler()方法中添加.setAllowedOrigins("*")。然后它终于工作了!如果你回答了这个问题,我会检查它,这样你就能得到你应得的信用。 - smuggledPancakes
6个回答

47

16
如果您在服务器代码中删除.withSockJs()调用和客户端代码中的/websocket,则也可以这样工作! 这是有技巧的,希望这能帮助未来的人们!再次感谢xerx593帮助我找到解决方案! - smuggledPancakes
哦我的天啊!!!太感谢了!!!这个问题困扰了我3个小时….. - chrischeng021
我浪费了3天时间!但这个有效了。哇!谢谢! - Deepak Agarwal

19

我按照https://spring.io/guides/gs/messaging-stomp-websocket/的官方教程,并添加了.withSockJS()。删除它有所帮助,因为在我的情况下我只想使用库StompJS。 - curiouscupcake

10

请查看规范。服务器应该使用 101 响应来表示从 http 切换到 ws 协议。


我仍然不确定该怎么做,这个链接提供了关于状态码200的进一步解释:https://dev59.com/EnXYa4cB1Zd3GeqP75bN服务器端肯定出了问题,但我不确定是哪里出了问题,我正在使用Tomcat 8.0.18。 - smuggledPancakes

5

不知道是否来得及,但我发现的一个解决方案是,在Spring Boot服务器中声明websocket端点后,简单地在该端点字符串之后添加/websocket。这将有助于保持转发逻辑并建立websocket连接。


4

对于那些像我一样使用angular + springboot并遇到此错误的人,请检查是否已启用重定向或将所有非 api 端点请求转发回 index.html,例如:

@RequestMapping(value = "/**/{[path:[^\\.]*}")
    public String redirect() {
        // Forward to home page so that route is preserved.
        return "forward:/index.html";
    }

如果您这样做了,请禁用它,您将获得101。

如果我需要同时使用redirect()方法和websocket,该怎么办? - Gleb
1
将你在Angular级别定义的所有路由路径放入值数组中。例如,你在app.module.ts中定义了"/login"、"/logout"和"/welcome"路由,并且还有一些以"api"开头的RESTful调用。那么你需要修改注释,像这样:@RequestMapping(value = {"/login", "/logout", "/welcome", "/api/**"})。 - Shuai Wang
只需删除您的WebSocket处理程序,@forguta? - Shuai Wang
这个对我很有帮助:https://github.com/jhipster/generator-jhipster/issues/9591。(我正在使用jhipster) - levacjeep

2
请确认 'ws://localhost:32768/DspClusterWebServices/myHandler' 是否正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接