
1、开启WebSocket支持
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
@Component
@ServerEndpoint(value = "/websocket/{userId}")
public class WebSocket {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private AtomicInteger onlineNumber = new AtomicInteger(0);
private Session session;
private String userID;
@onOpen
public void onOpen(@PathParam("userId") String userId, Session session) {
//把会话存到连接池中
this.session=session;
this.userID=userId;
onlineNumber.incrementAndGet();
System.out.println("有新连接加入!当前在线人数为" + onlineNumber.get() +" 当前session是" + session.hashCode()+" 用户id为: "+userId);
SessionPool.sessions.put(userId,session);
}
@onError
public void onError(Session session, Throwable error) {
logger.info("服务端发生了错误"+error.getMessage());
error.printStackTrace();
}
@onClose
public void onClose(Session session) throws IOException {
SessionPool.close(session.getId());
session.close();
System.out.println("websocket关闭成功!");
}
@onMessage
public void onMessage(String message, Session session){
try {
if(StringUtils.isNotBlank(message)){
//解析为JSON文件防止有个篡改
System.out.println(message);
SessionPool.sendMessage("小和尚",message);
}else {
logger.info("--用户不在线");
}
}catch (Exception e){
e.printStackTrace();
}
}
}
import org.springframework.stereotype.Component;
import javax.websocket.Session;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class SessionPool {
public static Map sessions = new ConcurrentHashMap();
public static void close(String sessionId) throws IOException{
for (String userID: sessions.keySet()) {
Session session= sessions.get(userID);
if(session.getId().equals(sessionId)){
sessions.remove(userID);
System.out.println(userID+"用户: "+LocalDate.now()+" 退出");
break;
}
}
}
public static void sendMessage(String userId,String message){
sessions.get(userId).getAsyncRemote().sendText(message);
}
public static void sendMessage(String message){
for (String sessionId:SessionPool.sessions.keySet()){
SessionPool.sessions.get(sessionId).getAsyncRemote().sendText(message);
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)