You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebSocket连接升级请求响应及Java实现方案咨询

你的推测完全正确!这段消息就是WebSocket的握手请求——它不是普通的RESTful请求,而是客户端用HTTP GET方法发起的「协议升级请求」,目的是把常规的HTTP连接转换成双向通信的WebSocket连接。

为什么这是WebSocket握手请求?

你收到的请求里的几个关键头部已经明确了它的身份:

  • Upgrade: websocketConnection: Upgrade:这是核心标识,告诉服务器客户端想要将当前HTTP连接升级为WebSocket连接
  • Sec-WebSocket-Key:客户端生成的随机字符串,用于服务器验证握手的合法性
  • Sec-WebSocket-Version: 13:指定使用的WebSocket标准版本(13是当前通用的标准版本)
如何接受这个握手请求?

要完成WebSocket握手,服务器需要返回一个符合规范的HTTP响应:

  1. 状态码必须是 101 Switching Protocols
  2. 必须包含以下响应头部:
    • Upgrade: websocket
    • Connection: Upgrade
    • Sec-WebSocket-Accept:这个值是通过**客户端的Sec-WebSocket-Key + 固定字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"**做SHA-1哈希,再转换为Base64编码得到的结果

不过你完全不用手动实现这个逻辑——Java里有成熟的框架可以帮你自动完成握手,只需要关注业务功能即可。

Java中实现的最佳方式

推荐优先使用成熟的WebSocket框架,避免手动处理底层握手细节,下面是两种常用方案:

方案1:Spring Boot + Spring WebSocket(最主流)

这是Java后端开发中最常用的WebSocket实现方式,配置简单,集成方便:

  1. 首先引入Maven依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 配置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("*"); // 生产环境请替换为实际允许的域名,不要用通配符
    }
}
  1. 实现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

火山引擎 最新活动