
浏览器直接访问 websocket 服务器地址(如 http://127.0.0.1:5801)会触发普通 http get 请求,不会携带 `sec-websocket-key`;必须通过前端 html 页面调用 javascript `websocket` api 才能发起符合协议的 websocket 握手。
WebSocket 是一种独立于 HTTP 的全双工通信协议,其连接建立依赖标准的 HTTP 升级(Upgrade)机制,但该机制仅在客户端显式调用 new WebSocket(url) 时触发。当你在浏览器地址栏输入 http://127.0.0.1:5801 并回车,浏览器执行的是常规页面导航(navigation),发送的是 Accept: text/html 类型的 HTTP 请求——这与 WebSocket 握手完全无关,因此自然不会包含 Sec-WebSocket-Key、Upgrade: websocket、Connection: Upgrade 等必需头字段。
✅ 正确做法是:
部署一个静态 HTML 页面(例如 index.html),在其中使用原生 WebSocket 构造函数连接你的服务端:
WebSocket Client WebSocket Test Client
Connecting...
? 关键注意事项:
- ✅ URL 必须以 ws://(开发)或 wss://(生产 HTTPS)开头;http:// 会导致 SecurityError;
- ✅ 确保 Java WebSocket 服务端已正确实现 @OnOpen、@OnMessage 等生命周期方法,并监听对应路径(如 /);
- ❌ 不要尝试用 fetch()、XMLHttpRequest 或表单提交模拟 WebSocket —— 它们无法触发协议升级;
- ? 若服务端启用了跨域限制(如 Tomcat 默认拦截),需在服务端配置允许来源(如 @ServerEndpoint(value = "/", configurator = CorsConfigurator.class));
- ? 调试建议:使用浏览器开发者工具的 Network → WS 标签页查看 WebSocket 连接详情,确认请求头中是否包含 Sec-WebSocket-Key 和 Upgrade: websocket。
简言之:浏览器本身不“访问 WebSocket”,而是由网页中的 JavaScript 主动发起 WebSocket 连接。这是协议设计决定的——它保障了安全性与语义明确性。把 HTML 文件托管在任意 Web 服务器(甚至 file:// 协议下部分浏览器也支持),即可完成端到端握手验证。










