添加WebSocket依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
<dependencies>
WebSocket配置
@Configuration
@EnableWebSocket
public class WebSocketConfig
{
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
WebSocket服务端
@Slf4j
@Component
@ServerEndpoint(value = "/ws/msg/server")
public class MsgWebSocketServer {
@Resource
private MsgInfoService msgInfoService;
private static final AtomicInteger onlineCount = new AtomicInteger(0);
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(8);
private static Map<String, Session> clients = new ConcurrentHashMap<>();
private static Map<String, String> clientParmas = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
Task task = new Task();
scheduledExecutorService.scheduleAtFixedRate(task, 1, 10, TimeUnit.SECONDS);
}
@OnOpen
public void onOpen(Session session) {
onlineCount.incrementAndGet();
clients.put(session.getId(), session);
}
@OnClose
public void onClose(Session session) {
onlineCount.decrementAndGet();
clients.remove(session.getId());
log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());
}
@OnError
public void onError(Session session, Throwable error) {
onlineCount.decrementAndGet();
clients.remove(session.getId());
log.error("WebSocket连接发生错误,连接:{}已断开,当前在线人数为:{}", session.getId(), onlineCount.get());
error.printStackTrace();
}
private void sendMessage(String message, Session toSession) {
try {
log.info("服务端给客户端[{}]发送消息[{}]", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端发送消息给客户端失败:{}", e.getMessage());
}
}
@OnMessage
public void onMessage(String message, Session session) throws ParseException {
log.info("服务端收到客户端[{}]的消息[{}]", session.getId(), message);
clientParmas.put(session.getId(), message);
if (!StringUtils.isEmpty(message)) {
String deStr = new String(Base64.getDecoder().decode(message));
Map<Object, Object> map = JSON.parseObject(deStr, Map.class);
final MsgInfoQO qo = new MsgInfoQO();
List<String> list = new ArrayList<>();
sendMessage(JSON.toJSONString(list), session);
}
}
class Task implements Runnable {
@Override
public void run() {
clients.keySet().forEach(key -> {
Session toSession = clients.get(key);
if (toSession != null) {
String parmas = clientParmas.get(toSession.getId());
if (!StringUtils.isEmpty(parmas)) {
String deStr = new String(Base64.getDecoder().decode(parmas));
Map<Object, Object> map = JSON.parseObject(deStr, Map.class);
List<String> list = new ArrayList<>();
sendMessage(JSON.toJSONString(list), toSession);
}
}
});
}
}
}