WebSocket连接升级请求响应及Java实现方案咨询
你的推测完全正确!这段消息就是WebSocket的握手请求——它不是普通的RESTful请求,而是客户端用HTTP GET方法发起的「协议升级请求」,目的是把常规的HTTP连接转换成双向通信的WebSocket连接。
为什么这是WebSocket握手请求?
你收到的请求里的几个关键头部已经明确了它的身份:
Upgrade: websocket和Connection: Upgrade:这是核心标识,告诉服务器客户端想要将当前HTTP连接升级为WebSocket连接Sec-WebSocket-Key:客户端生成的随机字符串,用于服务器验证握手的合法性Sec-WebSocket-Version: 13:指定使用的WebSocket标准版本(13是当前通用的标准版本)
如何接受这个握手请求?
要完成WebSocket握手,服务器需要返回一个符合规范的HTTP响应:
- 状态码必须是
101 Switching Protocols - 必须包含以下响应头部:
Upgrade: websocketConnection: UpgradeSec-WebSocket-Accept:这个值是通过**客户端的Sec-WebSocket-Key + 固定字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"**做SHA-1哈希,再转换为Base64编码得到的结果
不过你完全不用手动实现这个逻辑——Java里有成熟的框架可以帮你自动完成握手,只需要关注业务功能即可。
Java中实现的最佳方式
推荐优先使用成熟的WebSocket框架,避免手动处理底层握手细节,下面是两种常用方案:
方案1:Spring Boot + Spring WebSocket(最主流)
这是Java后端开发中最常用的WebSocket实现方式,配置简单,集成方便:
- 首先引入Maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
- 配置WebSocket端点:
import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { // 绑定/api/v1/tasks路径到自定义处理器 registry.addHandler(new TaskWebSocketHandler(), "/api/v1/tasks") .setAllowedOrigins("*"); // 生产环境请替换为实际允许的域名,不要用通配符 } }
- 实现WebSocket消息处理器:
import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; public class TaskWebSocketHandler extends TextWebSocketHandler { // 连接建立成功后触发 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("新的WebSocket连接建立:" + session.getId()); // 可以在这里给客户端发送初始的JSON消息 session.sendMessage(new TextMessage("{\"status\":\"connected\",\"msg\":\"连接成功\"}")); } // 处理客户端发来的文本消息(JSON格式可直接解析) @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String receivedJson = message.getPayload(); System.out.println("收到客户端JSON消息:" + receivedJson); // 这里添加你的业务逻辑,比如解析JSON、处理任务、返回响应 session.sendMessage(new TextMessage("{\"status\":\"success\",\"msg\":\"已收到消息\"}")); } // 连接关闭后触发 @Override public void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception { System.out.println("WebSocket连接关闭:" + session.getId()); } }
方案2:Java原生JSR 356 WebSocket API(轻量无框架)
如果你的项目没有用Spring,也可以用Java EE标准的WebSocket API(JSR 356),Tomcat、Jetty等容器都支持:
import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; // 直接指定WebSocket端点路径 @ServerEndpoint("/api/v1/tasks") public class TaskWebSocketEndpoint { // 连接建立时触发 @OnOpen public void onOpen(Session session) { System.out.println("WebSocket连接已建立:" + session.getId()); } // 收到客户端消息时触发 @OnMessage public String onMessage(String message) { System.out.println("收到客户端消息:" + message); // 返回响应消息,支持JSON格式 return "{\"status\":\"ok\",\"data\":\"已接收消息\"}"; } // 连接关闭时触发 @OnClose public void onClose(Session session) { System.out.println("WebSocket连接已关闭:" + session.getId()); } }
只需要把这个类放到Web应用的classpath下,容器会自动识别并处理握手请求,无需额外配置。
内容的提问来源于stack exchange,提问作者vico




