springboot 使用websocket demo

pom

<dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-websocket</artifactId>
       </dependency>

config

@Configuration
class WebSocket {
    @Bean
    fun serverEndpointExporter(): ServerEndpointExporter {
        return ServerEndpointExporter()
    }
}

core

@Component
@Service
@ServerEndpoint("/api/websocket")
class WebSocketService {
   companion object {
       /** 记录当前在线连接数  */
       private val onlineCount = AtomicInteger(0)
       /** 存放所有在线的客户端  */
       private val clients = ConcurrentHashMap<String, Session>()
   }
   /**
    * 连接建立成功调用的方法
    */
   @OnOpen
   fun onOpen(session: Session) {
       onlineCount.incrementAndGet() // 在线数加1
       clients[session.id] = session
       log.info("有新连接加入:{},当前在线人数为:{}", session.id, onlineCount.get())
   }
   /**
    * 连接关闭调用的方法
    */
   @OnClose
   fun onClose(session: Session) {
       onlineCount.decrementAndGet() // 在线数减1
       clients.remove(session.id)
       log.info("有一连接关闭:{},当前在线人数为:{}", session.id, onlineCount.get())
   }
   /**
    * 收到客户端消息后调用的方法
    *
    * @param message
    * 客户端发送过来的消息
    */
   @OnMessage
   fun onMessage(message: String, session: Session) {
       log.info("服务端收到客户端[{}]的消息:{}", session.id, message)
       this.sendMessage(message, session)
   }
   @OnError
   fun onError(session: Session, error: Throwable) {
       log.error("发生错误")
       error.printStackTrace()
   }
   /**
    * 群发消息
    *
    * @param message
    * 消息内容
    */
   private fun sendMessage(message: String, fromSession: Session) {
       clients.forEach { (k, v) ->
           if (!fromSession.id.equals(k)) {
               log.info("服务端给客户端[{}]发送消息{}", k, message)
               v.asyncRemote.sendText(message)
           }
       }
   }
}