WebSocket服务搭建完成后,在CopyOnWriteArraySet对象中存放了用户的信息(自定义具体属性),可以基于此对象的属性和业务自定义各种方法,本文只举例定义了向用户发送消息的方法
- 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- websocket配置
@Component
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
- websocket服务及自定义实时消息推送方法
@Component
@ServerEndpoint("/websocket/{userId}/{userToken}")
// ServerEndpoint里面定义的内容为前端调用服务的路径及参数,需要能够唯一区分
public class WebSocketServer {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 存放websocket对象
*/
private static CopyOnWriteArraySet<WebSocketServer> webSocketServerSet = new CopyOnWriteArraySet<>();
private Session session;
private String userId = "";
private String userToken = "";
//-----------------以下为服务必须方法------------------------------
/**
* 建立成功调用的方法
*/
@OnOpen
public void onOpen(@PathParam("userId")String userId,@PathParam("userToken")String userToken, Session session){
// 保存对象信息
this.session = session;
this.userId = userId;
this.userToken = userToken;
webSocketServerSet.add(this);
LOGGER.info("WebSocket连接成功,连接id:{}",userId);
}
/**
* 关闭连接
*/
@OnClose
public void onClose(){
webSocketServerSet.remove(this);
LOGGER.info("WebSocket关闭成功,连接id:{}",userId);
}
/**
* 连接异常
*/
@OnError
public void onError(Session session,Throwable error){
LOGGER.info("WebSocket连接异常");
error.printStackTrace();
}
/**
* 推送消息
*/
@OnMessage
public void onMessage(String message) throws IOException {
LOGGER.info("WebSocket收到消息 内容:"+message);
// 下面的if结构里的内容,为自定义内容,接受到消息为“ping”时,服务回复“pong”
// 作用:方便客户端与服务端保持心跳
if("ping".equals(message)){
sendMessage("pong");
}
}
//-----------------以下为自定义方法,根据业务需求自定义------------------------------
/**
* 推送消息
* @return
*/
public void sendMessage(String message) throws IOException {
LOGGER.info("WebSocket推送消息 推送内容:"+message);
this.session.getBasicRemote().sendText(message);
}
/**
* 指定用户推送消息
* @return
*/
public static void sendMessageToUser(String message,String userId) throws IOException {
for (WebSocketServer item : webSocketServerSet) {
try {
if(userId.equals(item.userId)){
item.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}