WebSocket使用教程 整合springboot

1.pom文件引入

  <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-websocket</artifactId>
 </dependency>

2.编写websocket 的配置类 这个配置完成相当于服务webstock

已经配好了

@Configuration
@EnableWebSocket  //注解需要写
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    //设置访问路径 ws://locahost/webStock/任意字符  这里是自定义的,/webstock/con 也行
        registry.addHandler(zdyWebSocketHandler, "/webStock/**")
                .setAllowedOrigins("*");
    }
}

  

 3.继承 TextWebSocketHandler 类实现具体业务

 

public class ZdyWebSocketHandler extends TextWebSocketHandler {
    
    private static CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();
    /**
     * 当WebSocket连接建立后调用
     * 
     * @param session 建立连接的WebSocket会话
     * @throws Exception 抛出的异常
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String requestedPath = session.getUri().getPath();
            System.out.println("WebSocket 连接已建立 established: " + session.getId());
            sessions.add(session);
            session.sendMessage(new TextMessage("WebSocket 连接已建立"));
    }

    /**
     * 处理接收到的文本消息
     * 
     * @param session 发送消息的WebSocket会话
     * @param message 接收到的文本消息
     * @throws Exception 抛出的异常
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        System.out.println("Received message: " + payload);
        
        // Echo the message back
        session.sendMessage(new TextMessage("Echo: " + payload));
    }

    /**
     * 当WebSocket连接关闭后调用
     * 
     * @param session 关闭连接的WebSocket会话
     * @param status 连接关闭的状态信息
     * @throws Exception 抛出的异常
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
        System.out.println("WebSocket 已关闭: " + session.getId() + ", status: " + status);
    }

    /**
     * 处理WebSocket传输过程中发生的错误
     * 
     * @param session 发生错误的WebSocket会话
     * @param exception 抛出的异常对象
     * @throws Exception 抛出的异常
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.err.println("WebSocket transport error: " + exception.getMessage());
        if (session.isOpen()) {
            session.close();
        }
        sessions.remove(session);
    }

    /**
     * 广播消息给所有连接的客户端
     * 
     * @param message 要广播的消息内容
     */
    public static void broadcastMessage(String message) {
        sessions.forEach(session -> {
            try {
                if (session.isOpen()) {
                    session.sendMessage(new TextMessage(message));
                }
            } catch (IOException e) {
                System.err.println("Error broadcasting message: " + e.getMessage());
            }
        });
    }
  
}

4.进阶使用,要在 TextWebSocketHandler 类 使用其它服务接口,需要添加构造函数

  

public class WebSocketConfig implements WebSocketConfigurer {

    private final  ZdyWebSocketHandler zdyWebSocketHandler;//添加构造函数

    public WebSocketConfig (ZdyWebSocketHandler xbimWebSocketHandler) {
       this.zdyWebSocketHandler = zdyWebSocketHandler;
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(xbimWebSocketHandler, "/webStock/**") .setAllowedOrigins("*"); } 
}
public class ZdyWebSocketHandler extends TextWebSocketHandler {
    
    private static CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();

 private final ZdyPushInfoService zdyPushInfoService;//其它的服务 添加这个就可以调用

    public ZdyWebSocketHandler(ZdyPushInfoService ZdyPushInfoService) {
        this.zdyPushInfoService =  zdyPushInfoService;
    }

    /**
     * 当WebSocket连接建立后调用
     * 
     * @param session 建立连接的WebSocket会话
     * @throws Exception 抛出的异常
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String requestedPath = session.getUri().getPath();
            System.out.println("WebSocket 连接已建立 established: " + session.getId());
            sessions.add(session);
            session.sendMessage(new TextMessage("WebSocket 连接已建立"));
    }

    /**
     * 处理接收到的文本消息
     * 
     * @param session 发送消息的WebSocket会话
     * @param message 接收到的文本消息
     * @throws Exception 抛出的异常
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        System.out.println("Received message: " + payload);
        
        // Echo the message back
        session.sendMessage(new TextMessage("Echo: " + payload));
    }

    /**
     * 当WebSocket连接关闭后调用
     * 
     * @param session 关闭连接的WebSocket会话
     * @param status 连接关闭的状态信息
     * @throws Exception 抛出的异常
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
        System.out.println("WebSocket 已关闭: " + session.getId() + ", status: " + status);
    }

    /**
     * 处理WebSocket传输过程中发生的错误
     * 
     * @param session 发生错误的WebSocket会话
     * @param exception 抛出的异常对象
     * @throws Exception 抛出的异常
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.err.println("WebSocket transport error: " + exception.getMessage());
        if (session.isOpen()) {
            session.close();
        }
        sessions.remove(session);
    }

    /**
     * 广播消息给所有连接的客户端
     * 
     * @param message 要广播的消息内容
     */
    public static void broadcastMessage(String message) {
        sessions.forEach(session -> {
            try {
                if (session.isOpen()) {
                    session.sendMessage(new TextMessage(message));
                }
            } catch (IOException e) {
                System.err.println("Error broadcasting message: " + e.getMessage());
            }
        });
    }
  
}

5.安全验证相关

  /**
     * 当WebSocket连接建立后调用
     * 
     * @param session 建立连接的WebSocket会话
     * @throws Exception 抛出的异常
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
 String requestedPath = session.getUri().getPath();
//服务连接进来自己验证是否可以连接
}

6.使用了nginx 后需要配置对应的 ws  服务端口,http 和https 是不一样的  

  

server {
listen80;
    server_name  域名;

    proxy_http_version  1.1;
    ……

#启用支持websocket连接的配置
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Connection          "upgrade";

    location / {
        proxy_redirect off;
        proxy_pass http://自己的地址;
        proxy_connect_timeout 60;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
    }

}

重要的是这两行,它表明是websocket连接进入的时候,进行一个连接升级将http连接变成websocket的连接。  

启用支持websocket连接:

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy read timeout 表明连接成功以后等待服务器响应的时候,如果不配置默认为60s;

proxy_http_version 1.1;表明使用http版本为1.1

  


posted @ 2025-11-18 16:34  三苇渡江  阅读(5)  评论(0)    收藏  举报