尝试连接WebSocket时出现404错误,请求技术协助
看起来你的核心问题是@ServerEndpoint注解的WebSocket端点没有被Tomcat正确注册,导致客户端请求返回404。结合你的环境(Tomcat 7.0.52 + Java 8 + NetBeans),我帮你梳理几个关键排查和修复步骤:
1. 确认Tomcat 7的WebSocket支持前提
Tomcat 7从7.0.47版本开始支持JSR-356(Java WebSocket规范),你的7.0.52版本是符合要求的,但要注意:
- 不要在项目的
WEB-INF/lib下手动添加javax.websocket-api.jar或tomcat-websocket.jar,Tomcat自身的lib目录已经包含这些依赖,重复添加会导致类加载冲突。 - 如果你的项目用Maven管理,确保WebSocket相关依赖的
<scope>设置为provided,让Tomcat使用自带的库。
2. 检查web.xml的版本与注解扫描配置
如果你的web.xml是2.5及以下版本,默认不会启用注解自动扫描,Tomcat无法识别@ServerEndpoint注解。你需要升级web.xml到3.0+版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- 无需额外配置,默认启用注解扫描 --> </web-app>
如果无法升级web.xml,你可以手动注册端点,但升级到3.0+是更简单的方案。
3. 验证类的打包路径
确保你的MonitorWebSocket.class文件被正确打包到服务器的WEB-INF/classes/com/myserver/server/monitor/目录下。你可以直接解压服务器上的WAR包,或者查看NetBeans构建后的dist目录,确认类文件存在且路径完全匹配包名。
4. 排查Tomcat日志与路径拦截
- 查看
localhost.log(而非仅catalina.out),里面会记录WebSocket端点的注册日志,如果有注册失败的信息会在这里体现。 - 检查Tomcat的
conf/web.xml和项目的web.xml,确认没有Filter或Servlet占用了/wss路径,避免端点被拦截。
5. 简化测试代码排查
先写一个最简的WebSocket端点进行测试,排除业务代码的干扰:
package com.myserver.server.monitor; import javax.websocket.OnMessage; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/testws") public class TestWebSocket { @OnMessage public String echo(String message) { return "Echo: " + message; } }
客户端用最简代码测试:
function initTest(){ var ws = new WebSocket('wss://myserver.com/testws'); ws.onopen = () => ws.send("hello"); ws.onmessage = (e) => console.log(e.data); }
如果这个最简版本还是返回404,那基本可以确定是Tomcat的注解扫描或依赖冲突问题。
6. 临时切换HTTP测试(排除WSS干扰)
为了排除HTTPS配置的影响,你可以先在服务器上测试HTTP版本的WebSocket(ws://myserver.com/testws)。如果HTTP版本能正常连接,再回头排查WSS的SSL配置(比如Tomcat的证书是否有效、SSL端口是否正确映射)。
内容的提问来源于stack exchange,提问作者jaume

