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