本文是基于注释的案例,对于发送语音采用了类似文件上传下载一样的方式实现,不过播放会有一点儿延迟,正在改进。
1、首先导入webScoket相关的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、开启WebScoket支持
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* 开启WebSocket支持
*/
@Configuration
public class WebSocketConfig {
/**
*外置tomcat不需要配置此bean
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3、定义一个websocket服务器端
/**
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@ServerEndpoint(value = "/{room}/{Id}")
@Component
public class MyWebSocket {
/**
* 自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的
*/
private static AtomicInteger room1OnlineCount = new AtomicInteger(0);
private static AtomicInteger room2OnlineCount = new AtomicInteger(0);
private static AtomicInteger room3OnlineCount = new AtomicInteger(0);
/**
* concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
*/
/* private static CopyOnWriteArraySet<MyWebSocket> room1WebSocketSet = new CopyOnWriteArraySet<>();
private static CopyOnWriteArraySet<MyWebSocket> room2WebSocketSet = new CopyOnWriteArraySet<>();
private static CopyOnWriteArraySet<MyWebSocket> room3WebSocketSet = new CopyOnWriteArraySet<>();
*/
/**
* 所有的MyWebSocket对象放在一个map中,方便私聊直接发送
*/
private static ConcurrentHashMap<Str