Websocket实现方式二——注解方式

添加Websocket依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

根据@ServerEndpoint注解注册Websocket

java 复制代码
@Configuration
public class AgentWsConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }

}

创建Websocket注解实现的类@ServerEndpoint注解标记类

java 复制代码
@ServerEndpoint("/websocket/{sessionId}")
@Component
@Slf4j
public class AgentWsServerPoint {
    /**
     * websocket连接集合,根据Redis广播来的sessionId,来管理Session(取用和删除)
     */
    private static final Map<String, Session> SESSION_MAP = new ConcurrentHashMap<>();

    /**
     * 建立连接
     * @param sessionId
     * @param session
     */
    @OnOpen
    public void onOpen(@PathParam("sessionId") String sessionId, Session session) {
        SESSION_MAP.put(sessionId, session);
        log.info("WebSocket已打开,会话ID是:{}", sessionId);
        log.info(sessionId + "建立了连接");
    }

    /**
     * 接收消息并发送消息
     * @param sessionId
     * @param message
     * @param session
     * @return
     */
    @OnMessage
    public String onMessage(@PathParam(value = "sessionId") String sessionId,String message, Session session) throws Exception {
        log.info(sessionId + ":" + message);//客户端推送过来的消息
        
        Session session = SESSION_MAP.get(sessionId);
        try {
               session.getBasicRemote().sendText("Hello World!"); // 给特定用户发送消息
               log.info("消息发送成功");
            } catch (IOException e) {
                e.printStackTrace();
                log.error("消息发送失败");
                throw e;
            }
        return null;
    }

  
    /**
     * 关闭连接
     * @param sessionId
     * @param session
     */
    @OnClose
    public void onClose(@PathParam(value = "sessionId") String sessionId,Session session) throws IOException {
        if(SESSION_MAP.containsKey(sessionId)){
            Session session1 = SESSION_MAP.get(sessionId);
            session1.close();
            SESSION_MAP.remove(sessionId);
        }
        log.info("websocket is close ,session id is {}",sessionId);
    }
 }

  
相关推荐
fiveym1 小时前
二层核心网络技术通俗解析(VLAN/Access/Trunk/LACP/ARP)
服务器·网络·网络协议
草木深雨纷纷1 小时前
mt管理器手机版下载2026最新版更新下载分享
linux·运维·网络·智能手机
lifejump1 小时前
Dede(织梦)CMS渗透测试(all)
前端·网络·安全·web安全
SEO_juper2 小时前
谷歌本地 GEO 权重拆解,全域 SEO 落地实操
大数据·网络·ai·seo·跨境电商·geo·跨境电商独立站
BY组态2 小时前
Ricon组态系统实战:从0到1搭建工业监控平台
网络·物联网·iot·web组态·组态
专注VB编程开发20年2 小时前
Vscode调试是真不方便
网络·网络协议
Yang96112 小时前
鼎讯 CM-K60 光缆普查仪:铁路高速光缆识别利器
网络
Qt程序员3 小时前
突破I/O天花板:Linux零拷贝技术
网络·linux内核·io·linq·零拷贝·mmap
mobai73 小时前
frr使用Valgrind定位内存泄漏
网络协议
HackTwoHub3 小时前
AI提示词注入绕过工具:一键绕过Codex/Claude安全限制,CTF夺旗与渗透测试必备神器
网络·人工智能·安全·web安全·系统安全·网络攻击模型·安全架构