Websocket实现方式一

创建Websocket处理器继承AbstractWebSocketHandler

  • 覆写public void afterConnectionEstablished(WebSocketSession session)方法,建立Websocket连接
  • 覆写protected void handleTextMessage(WebSocketSession session, TextMessage message)方法,处理接收的消息
  • 发送消息方法webSocketSession.getWebSocketSession().sendMessage(new TextMessage(msg));
  • 覆写异常处理方法public void handleTransportError(WebSocketSession session, Throwable exception)
  • 覆写websocket关闭方法public void afterConnectionClosed(WebSocketSession session, CloseStatus status)
java 复制代码
@Slf4j
@Component
public class MyWsHandler extends AbstractWebSocketHandler {
    private static final Map<String, Session> sessionMap ;//websocket连接集合
    static {
        //初始化
        sessionMap = new ConcurrentHashMap<>();
    }

    /**
     * 建立连接
     * @param session
     * @throws Exception
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        super.afterConnectionEstablished(session);
        sessionMap.put(session.getId(),session);
        log.info(session.getClientId()+"建立了连接");
    }

    /**
     * 接收消息并处理
     * @param session
     * @param message
     * @throws Exception
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
        log.info(sessionBeanMap.get(session.getId()).getClientId()+":"+message.getPayload());
        String param = message.getPayload();//接收到的消息
        sendMessageToOne(session.getId(),param);//发送消息
    }

    /**
     * 传输异常
     * @param session
     * @param exception
     * @throws Exception
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        super.handleTransportError(session, exception);
        if(session.isOpen()){
            session.close();
        }
        sessionMap.remove(session.getId());
    }

    /**
     * 连接关闭
     * @param session
     * @param status
     * @throws Exception
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        int clientId = sessionMap.get(session.getId()).getClientId();
        sessionMap.remove(session);
        log.info(clientId+"关闭了连接");
        super.afterConnectionClosed(session, status);
    }
    /**
     * 给指定用户窗口推送消息
     * @param userId
     * @param param
     */
    public void sendMessageToOne(String userId,String param){
        try {
                sessionMap.get(userId).sendMessage(new TextMessage("Hello World!"));
            } catch (IOException | ExecutionException | InterruptedException e) {
                e.printStackTrace();
            }
    }
}

创建Websocket拦截器继承HttpSessionHandshakeInterceptor(非必须)

  • 建立连接前做处理,覆写public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes)
  • 建立连接后做处理,覆写public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex)
java 复制代码
@Component
@Slf4j
public class MyInterceptor extends HttpSessionHandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
       log.info(request.getRemoteAddress().toString()+"开始握手");
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        log.info(request.getRemoteAddress().toString()+"完成握手");
        super.afterHandshake(request, response, wsHandler, ex);
    }
}

注册Websocket处理器和Websocket拦截器

java 复制代码
@Configuration
@EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {
    @Resource
    private MyWsHandler myWsHandler;
    @Resource
    private MyInterceptor myWsInterceptor;

    /**
     * 注册,websocket访问路径/myWebsocket
     * @param registry
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWsHandler,"/myWebsocket").addInterceptors(myWsInterceptor).setAllowedOrigins("*");
    }
}
相关推荐
iDao技术魔方19 分钟前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
网络·网络协议·http
上海云盾-小余41 分钟前
UDP 反射放大攻击溯源:流量特征识别与分层封禁实战
网络·网络协议·udp
wangl_921 小时前
Wireshark 使用指南:从入门到高级分析
网络·网络协议·tcp/ip·测试工具·wireshark·modbus
pengyi8710151 小时前
易代理分层IP池搭建,高并发业务弹性扩容方案
网络·网络协议·tcp/ip
Walter先生1 小时前
中金所股指期货主力合约自动识别:一个接口搞定 IF/IC/IH 连续合约合成
后端·websocket·架构·实时行情数据源
ZhengEnCi3 小时前
Q0-网络请求是什么?API?🌐
网络协议
享乐主3 小时前
DHCP - Dynamic Host Configuration Protocol
网络协议·dhcp
Shota Kishi4 小时前
深入解析 Solana RPC getTransaction 性能优化:以最近 30 个 epoch 为重点的历史交易检索提速实践
网络协议·性能优化·rpc
葱卤山猪4 小时前
【自用】解析http post表单数据,将其中的二进制数据保存到csv文件且加载到内存
网络·网络协议·http
小船跨境4 小时前
2026 Google代理指南:如何安全获取搜索数据?
网络协议·tcp/ip·安全