版权声明:未经允许,不得转载 https://blog.csdn.net/dhj199181/article/details/83537376
废话不多说,直接上代码,本人亲自测试,可以使用。
前台js代码:
var websocket;
var path = window.location.host+"/web-socket";
// 首先判断是否 支持 WebSocket
if('WebSocket' in window) {
websocket = new WebSocket("ws://"+path+"/ws");
} else if('MozWebSocket' in window) {
websocket = new MozWebSocket("ws://"+path+"/ws");
} else {
websocket = new SockJS(window.location.origin+"/web-socket/socketJs/");
}
// 打开连接时
websocket.onopen = function(evnt) {
console.log(" websocket.onopen ");
};
// 收到消息时
websocket.onmessage = function(evnt) {
console.log(evnt.data);
};
websocket.onerror = function(evnt) {
console.log(" websocket.onerror ");
};
websocket.onclose = function(evnt) {
console.log(" websocket.onclose ");
}
后台java代码
WebSocketConfig.java
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer{
@Autowired
private SocketHandler socketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(socketHandler, "/ws").addInterceptors(new HttpSessionHandshakeInterceptor());
registry.addHandler(socketHandler, "/sockjs/socketServer").addInterceptors(new HttpSessionHandshakeInterceptor()).withSockJS();
}
}
WebSocketInterceptor.java
public class WebSocketInterceptor implements HandshakeInterceptor{
private static final Log log=LogFactory.getLog(WebSocketInterceptor.class);
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Exception exceptions) {
log.info("=================执行 afterHandshake :handler: "+handler+"exceptions: "+exceptions);
}
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler,
Map<String, Object> map) throws Exception {
log.info("==================执行 beforeHandshake :handler: "+handler+"map: "+map.values());
if(request instanceof ServerHttpRequest){
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
HttpSession session = servletRequest.getServletRequest().getSession();
if(session!=null){
User user=(User)session.getAttribute("user");
log.info("==================user== "+user);
map.put(user.getUserName(), user);
}
}
return true;
}
}
SocketHandler.java
@Service
public class SocketHandler implements WebSocketHandler{
private static final Log log=LogFactory.getLog(SocketHandler.class);
private static final Map<String,WebSocketSession> userMap;
//在线用户
static {
userMap = new HashMap<>();
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus arg1) throws Exception {
log.info("Websocket:"+session.getId()+"已经关闭!");
String userId=this.getUserName(session);
if(userMap.get(userId) != null){
userMap.remove(userId);
log.info("Websocket:"+userId+"用户已经移除!");
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String userId=this.getUserName(session);
if(userMap.get(userId) == null){
userMap.put(userId, session);
log.info("Websocket:"+userId+"用户建立连接成功!");
}else{
log.info("Websocket:"+userId+"用户已经连接!");
}
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
session.sendMessage(message);
log.info("Websocket:handleMessage send message:"+message);
}
@Override
public void handleTransportError(WebSocketSession arg0, Throwable error) throws Exception {
log.error("Websocket:handleMessage send message:"+error);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
public void sendMessageToUser(String userId, TextMessage message) {
WebSocketSession session = userMap.get(userId);
if(session !=null && session.isOpen()) {
try {
session.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @Title: sendMessageToUsers
* @Description: 给所有用户发送信息
* @param @param message
* @return void
* @date createTime:2018年4月26日上午9:44:33
*/
public void sendMessageToUsers(String msg) {
TextMessage message = new TextMessage(msg);
Set<String> userIds = userMap.keySet();
for(String userId: userIds) {
this.sendMessageToUser(userId, message);
}
}
/**
* @Title: getUserId
* @Description: 获取用户id
* @param @param session
* @param @return
* @return String
* @date createTime:2018年4月26日上午9:44:59
*/
public String getUserName(WebSocketSession session){
Object obj = session.getAttributes().get("user");
if(obj instanceof User){
User user = (User) obj;
return user.getUserName();
}
return null;
}
public void sendMessage(Object object) {
TextMessage message = new TextMessage(JSONObject.toJSONString(object));
Set<String> userIds = userMap.keySet();
for(String userId: userIds) {
this.sendMessageToUser(userId, message);
}
}
}