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);
    }
 }

  
相关推荐
计算机小手1 小时前
内网穿透系列九:开源的网络穿透与组网工具 EasyTier,支持多种数据传输通道,去中心化,兼具高效与安全
网络·经验分享·开源软件
YC运维1 小时前
网络配置综合实验全攻略(对之前学习的总结)
linux·服务器·网络
yqcoder2 小时前
13. https 是绝对安全的吗
网络协议·安全·https
Xi-Xu2 小时前
隆重介绍 Xget for Chrome:您的终极下载加速器
前端·网络·chrome·经验分享·github
孙克旭_4 小时前
day051-ansible循环、判断与jinja2模板
linux·运维·服务器·网络·ansible
悟空胆好小5 小时前
分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
网络·人工智能·科技·嵌入式硬件
DoraBigHead5 小时前
《电磁波的浪漫,铜线上的灵魂》——计算机网络·物理层全解版
网络协议
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ5 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
ssswywywht6 小时前
OSPF实验
网络
FCM666 小时前
HCIA第一次实验报告:静态路由综合实验
网络·tcp/ip·信息与通信