在写servlet的时候,如果用注解的方法去获取websocket,你需要在服务器指定路径。这时,如果把路径结尾设置成chat是不能获取websocket的,不信的可以去试试。

这个问题折腾了我一晚上…最后还是没搞清楚这个问题是怎么发生的。

一、问题场景

servlet关于websocket服务端的部分代码如下:

绝对不能这样写:

这样是无法创建链接的,不会报任何的错误,服务也能正常的启动,但就是接收不到任何来自websocket的信息。

二、尝试解决

我反复检查代码,怎么检查怎么没问题,所以我又去用写过的服务器去测试了链接,发现连接正常,但是只要路径为chat,websocket怎样都连接不上。

chrome一直在报错:

WebSocket connection to ‘ws://localhost:8080/12.8login/chat’ failed: Error during WebSocket handshake: Unexpected response code: 302

302错误。我一开始以为是web.xml的问题,但是如果web.xml出错,连项目启动都成问题,现在显然不是这个情况。

然后我去网上google了很多,根本没有类似的解决办法。

三、解决办法

在我绝望的时候,直接把chat改成了“fuck”,然后去测试链接,结果一连就连上了…

反正只要路径是chat,就死活连不上,我可以保证这个路径没有冲突,但是就是连不上!后来我回头实验了很多次,只要路径是chat就有问题,别的都没问题…

四、总结

我目前还不清楚是什么引起了这个问题。从来没想过路径还有保留字的情况!

五、回顾

回头一看,已经是1年前的文章了。当时我使用websocket是为了写一个简单的聊天室,用来交操作系统老师的差。后来我又完善了这个聊天室,逐渐写出了好友功能,群功能,也实现了那种网页上的在线聊天框的那种效果,也用其他语言重构过聊天室,感觉收获是一次次变多。

但是每当使用websocket的时候,我都会回想起/chat路径的问题。除了写下这篇文章的这次外,其他情况下都能正常使用/chat路径,再也没有重现过当时的那次折腾了我一晚上的bug…

当然现在我也不会再去使用servlet了,遇到这个bug也是一种奇妙的缘分,且行且珍惜吧。

2 对 “异常 java-servlet-websocket 遇到莫名其妙的路径问题”的想法;

    1. 首先感谢您的回复。现在想来,这个bug很可能不是/chat路径的关系,因为我以后使用websocket再也没有重现过这个错误。这个bug很有可能只是那天晚上的种种巧合导致的。
      虽然有各种各样的问题,但是websocket这个协议在处理实时性要求比较强的问题上表现得很出色。我后来就实现了很不错的h5聊天工具。如果善用,应该能胜任很多场景。
      希望彼此之间能多交流,努力学习!

发表评论

电子邮件地址不会被公开。 必填项已用*标注