WebSocket服务及实时消息推送实现

WebSocket服务搭建完成后,在CopyOnWriteArraySet对象中存放了用户的信息(自定义具体属性),可以基于此对象的属性和业务自定义各种方法,本文只举例定义了向用户发送消息的方法

  1. 依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
  1. websocket配置
@Component
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
  1. websocket服务及自定义实时消息推送方法
@Component
@ServerEndpoint("/websocket/{userId}/{userToken}")
// ServerEndpoint里面定义的内容为前端调用服务的路径及参数,需要能够唯一区分
public class WebSocketServer {

    /**
     * 日志
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);
    /**
     * 存放websocket对象
     */
    private static CopyOnWriteArraySet<WebSocketServer> webSocketServerSet = new CopyOnWriteArraySet<>();

    private Session session;

    private String userId = "";

    private String userToken = "";

	//-----------------以下为服务必须方法------------------------------
	
    /**
     * 建立成功调用的方法
     */
    @OnOpen
    public void onOpen(@PathParam("userId")String userId,@PathParam("userToken")String userToken, Session session){
        // 保存对象信息
        this.session = session;
        this.userId = userId;
        this.userToken = userToken;
        webSocketServerSet.add(this);
        LOGGER.info("WebSocket连接成功,连接id:{}",userId);
    }

    /**
     * 关闭连接
     */
    @OnClose
    public void onClose(){
        webSocketServerSet.remove(this);
        LOGGER.info("WebSocket关闭成功,连接id:{}",userId);
    }

    /**
     * 连接异常
     */
    @OnError
    public void onError(Session session,Throwable error){
        LOGGER.info("WebSocket连接异常");
        error.printStackTrace();
    }

    /**
     * 推送消息
     */
    @OnMessage
    public void onMessage(String message) throws IOException {
        LOGGER.info("WebSocket收到消息 内容:"+message);
        // 下面的if结构里的内容,为自定义内容,接受到消息为“ping”时,服务回复“pong”
        // 作用:方便客户端与服务端保持心跳
        if("ping".equals(message)){
            sendMessage("pong");
        }
    }

    //-----------------以下为自定义方法,根据业务需求自定义------------------------------


    /**
     * 推送消息
     * @return
     */
    public void sendMessage(String message) throws IOException {
        LOGGER.info("WebSocket推送消息 推送内容:"+message);
        this.session.getBasicRemote().sendText(message);
    }

    /**
     * 指定用户推送消息
     * @return
     */
    public static void sendMessageToUser(String message,String userId) throws IOException {
        for (WebSocketServer item : webSocketServerSet) {
            try {
                if(userId.equals(item.userId)){
                    item.sendMessage(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值