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("*");
    }
}
相关推荐
辣椒思密达1 天前
AI出海产品本地化测试:住宅IP在模拟海外用户环境中的实践价值
网络协议·tcp/ip·安全·php·苹果vision pro
花生了什么事o1 天前
DNS:把域名翻译成 IP 的层级查询机制
网络·网络协议·tcp/ip
2401_873479401 天前
金融合规新规下IP查询怎么做?用IP离线库实现数据不出域
网络协议·tcp/ip·金融·ip
微硬创新1 天前
汽车制造产线协同:耐达讯PROFINETDeviceNet网关在机器人通信中的应用
人工智能·物联网·网络协议·自动化·汽车·制造·信息与通信
米尔的可达鸭1 天前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
Keepingrun1 天前
http登录和授权
网络·网络协议·http
Lhappy嘻嘻1 天前
网络初识|基础入门:局域网广域网、IP 端口、TCP/IP 五层模型与封装解封装全过程
java·开发语言·网络·笔记·网络协议·tcp/ip
laoli_coding2 天前
如何配置HTTPS站点访问的免费SSL域名证书
网络协议·https·node.js·ssl
Keepingrun2 天前
HTTP基础
网络·网络协议·http
apihz2 天前
全球域名 WHOIS 信息实时查询免费 API 接口教程,支持1000+后缀
android·网络·网络协议·tcp/ip·apache·域名·whois