首先添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
然后创建一个配置类
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
在添加一个sockerServer
@Component
@ServerEndpoint(value = "/socketServer/{clientId}")//通过这个路径可以让客户端链接到server
public class WebSocketServer {
private Session session;
public static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
public static ConcurrentHashMap<String, String> sessionIds = new ConcurrentHashMap<>();
public void setSession(Session session) {
this.session = session;
}
//服务端被链接以后要做的事情
@OnOpen
public void open(Session session, @PathParam(value = "clientId") String clientId) {
this.session = session;
sessionPool.put(clientId, session);
sessionIds.put(session.getId(), clientId);
}
//接收到消息时
@OnMessage
public void onMessage(String message) {
String sessionId = session.getId();
sendMessage(message, sessionIds.get(sessionId));
}
//关闭链接是
@OnClose
public void onClose() {
sessionPool.remove(sessionIds.get(session.getId()));
sessionIds.remove(session.getId());
}
//出现异常时
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
//群发消息
public synchronized static void sendMessage(String message, List<Integer> clientId) {
for (Integer userId : clientId) {
Session s = sessionPool.get(userId + "");
if (s != null) {
try {
s.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//单发消息
public synchronized static void sendMessage(String message, String clientId) {
Session s = sessionPool.get(clientId);
if (s != null) {
try {
s.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
然后测试一下,启动项目
在页面上 websocket在线测试
输入路径建立链接
发送消息
就可以通过消息队列或者一些接口对这个方法调用完成推送