一、新建WebSocketConfig配置类:
在配置类中使用@Autowired注入service如下代码:
@Component
@Slf4j
public class WebSocketConfig extends ServerEndpointConfig.Configurator{
@Override
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
StandardSessionFacade ssf = (StandardSessionFacade) request.getHttpSession();
if (ssf != null) {
HttpSession httpSession = (HttpSession) request.getHttpSession();
//关键操作
sec.getUserProperties().put("sessionId", httpSession.getId());
log.info("获取到的SessionID:" + httpSession.getId());
}
super.modifyHandshake(sec, request, response);
}
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
//注入service
@Autowired
public void setWebsocketService(WebSocketService websocketService){
WebSocket.webSocketService= websocketService;
}
}
二、websocket客户端服务类中创建静态方法如代码:
Component
@ServerEndpoint("/webSocket/{username}")
@Slf4j
@ChannelHandler.Sharable
public class WebSocket {
/**
* 在线人数
*/
public static int onlineNumber = 0;
/**
*静态注入
*/
public static WebSocketService webSocketService;
/**
* 以用户的姓名为key,WebSocket为对象保存起来
*/
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
/**
* 会话
*/
private Session session;
/**
* 用户名称
*/
private String username;
/**
* 建立连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("username") String username, Session session) throws IOException, InterruptedException {
onlineNumber++;
log.info("现在来连接的客户id:" + session.getId() + "用户名:" + username);
this.username = username;
this.session = session;
clients.put(username, this);
log.info("有新连接加入! 当前在线人数" + onlineNumber);
//登录时判断有没有消息
List<WebSocketMsgDto> messageList = webSocketService.massageList(username);
if(!BasesUtil.isEmpty(messageList)){
for (WebSocketMsgDto webSocketMsgDto:messageList) {
Thread.sleep(10000);
webSocketService.sendMessageTo(webSocketMsgDto.getMessage(),webSocketMsgDto.getUsername());
webSocketService.setMessageStatus(webSocketMsgDto.getId());
}
}
}
@OnError
public void onError(Session session, Throwable error) {
log.info("服务端发生了错误" + error.getMessage());
error.printStackTrace();
}
/**
* 连接关闭
*/
@OnClose
public void onClose() {
onlineNumber--;
clients.remove(username);
log.info("{}连接关闭! 当前在线人数{}", username, onlineNumber);
}
/**
* 收到客户端的消息
*
* @param message 消息
* @param session 会话
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("来自客户端消息:" + message + "客户端的id是:" + session.getId());
}
public void sendMessageTo(String message, String ToUserName) throws IOException {
for (WebSocket item : clients.values()) {
if (item.username.equals(ToUserName)) {
//异步发送 最好控制发送间隔
item.session.getAsyncRemote().sendText(message);
//同步发送==>高并发使用,可不用控制发送间隔
//item.session.getBasicRemote().sendText(message);
return;
} else {
webSocketService.saveMassage(ToUserName,message);
return;
}
}
}
public void sendMessageAll(String message) throws IOException {
for (WebSocket item : clients.values()) {
item.session.getAsyncRemote().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineNumber;
}
}