咱就是说javax.websocket在tomcat下连接失败问题
-----------------------------------------------------
【咱就是说】系列
前言废话:
如果网页端要与服务器建立持久的连接,并且服务器随时有可能给网页发消息传达当前局势发生变化,由于html中无法使用普通socket(除非ActiveX控件),那这个通讯采取主要就两种对策,一种ajax,一种websocket
某时我在只学过Java SE的情况下,短期内接到一个有上述需求的任务,需要快速自学相关知识,现在想想,当初应该采用ajax来着,真正编写其实也不复杂。我当时限于时间与每天若干让人冻死累死头疼死的事情,觉得websocket听起来比较现成,就开始下载j2ee相关实例和文章,其中若干头疼过程略去不写。
最后,我终于把这个服务端在eclipse中运行了起来(我也不知道离了eclipse怎么运行)。我不得不用windows server装上服务器,并且里面还装着eclipse(听起来太荒谬了)。但是当时学校还有一堆破事,我也没来得及处理那么多就走了不管了。
后来过年那几天迁到了另一台服务器,新的服务器懒得装eclipse了,那个服务端又得要求演示,所以我就考虑把通讯改一下,改成ajax的,要么再试试让它在系统里直接运行。然后我才得知了J2EE和Java SE不同,它不是在命令行里面使用[java 类名]的方法运行的,它也没有入口函数public static void main(String[] args),也不是通过入口函数main开始运行的,而是应该打开Tomcat,然后由Tomcat来调度它。
正文:
(在eclipse完全正常运行)然后我当然把相关内容按照格式扔进webapps,发现网页可以正常打开,但是js中,连接websocket就失败了,以为是web.xml配置问题,关于它的尝试过程略去不写。后来发现证明,根本无需配置web.xml,web.xml里面无需添加<servlet>的内容,eclipse自动生成的web.xml中就没有。
然后进一步探测发现,当发送GET且Upgrade为ws请求时,Tomcat原本应该返回101 Switching Protocols,但是事实上它返回了404 Not Found,这说明与wsServer相关的服务没有工作。
为了验证此事是WebSocket的问题,还是整个Servlet的问题,我又加了个ServletTest,在eclipse中完全正常运行,导出war然后让Tomcat打开它,访问出现了500内部错误,然后接下来有两个段落描述错误信息,其中第二段落的第一句有一句关键性提示,用中文说出来,大致意思就是,无法加载这个类,因为版本不够,现有JRE自己版本是55,而人家这个类需要版本60的JRE。
我本地的%Java_Home%装的是jdk11,因为我刚开始接触Java那会是2014年,当时普遍还在用java7,后来形成的直觉就是java11已经是接近于最高的版本了,它竟然说我版本不够,我一看eclipse里面的运行库赫然写着:JRE17。我试着把eclipse里面换成了我的jdk11,在eclipse里运行得到了相同的500错误,就证明该错误确实是由于JRE版本造成的。那个JRE17所在文件夹是存在于一个[org.eclipse.某某]文件夹中,把环境变量改成它,Tomcat运行正常。
事后证明,在Tomcat8.5和Tomcat9.0都可以正常运行。
接下来由于Tomcat和自己的网站(另一个服务端)争抢80端口,打算再来个nginx。
(完)
发表时间:posted on 2022-03-30 10:45 Sherilyn
修改时间:2022-8-31
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话