首页>代码>spring boot+mvc+mybatis+netty-sokey.io+html+js实现简单即时通讯聊天系统>/demo-spring-netty/src/main/java/com/xe/demo/common/netty/MessageEventHandler.java
package com.xe.demo.common.netty; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.corundumstudio.socketio.AckRequest; import com.corundumstudio.socketio.SocketIOClient; import com.corundumstudio.socketio.annotation.OnConnect; import com.corundumstudio.socketio.annotation.OnDisconnect; import com.corundumstudio.socketio.annotation.OnEvent; import com.xe.demo.common.pojo.CacheMap; import com.xe.demo.common.pojo.MessageInfo; import com.xe.demo.common.pojo.MessageRoom; import com.xe.demo.model.User; import com.xe.demo.service.UserService; @Component public class MessageEventHandler { private static Map<String, SocketIOClient> clientMap = new HashMap<String, SocketIOClient>(); @Autowired private UserService userService; // 添加connect事件,当客户端发起连接时调用,本文中将clientid与sessionid存入数据库 // 方便后面发送消息时查找到对应的目标client, @OnConnect public void onConnect(SocketIOClient client) { String uid = client.getHandshakeData().getSingleUrlParam("uid"); if(!clientMap.containsKey(uid)){ clientMap.put(uid, client); } User user = userService.queryUser(new User(uid, null)); if (user != null) { user.setOnline(1); userService.update(user); } } // 添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息 @OnDisconnect public void onDisconnect(SocketIOClient client) { String uid = client.getHandshakeData().getSingleUrlParam("uid"); clientMap.remove(uid); User user = userService.queryUser(new User(uid, null)); if (user != null) { user.setOnline(0); userService.update(user); if(1 != user.getType()){//非客服用户 Map<String, Object> value = userService.queryCustomerInfo(uid); //清除对应的缓存值 CacheMap.remove(value); } } } // 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息 @OnEvent(value = "sendMsg") public void sendMsg(SocketIOClient client, AckRequest request, MessageInfo sendData) { client.sendEvent("sendMsg", sendData); String tagUid = sendData.getTagUid(); SocketIOClient tagClient = clientMap.get(tagUid); if(null != tagClient){ tagClient.sendEvent("sendMsg", sendData); if(1 != sendData.getSrcType()){//非客服用户 //该客服服务的用户列表 @SuppressWarnings("unchecked") List<Map<String, Object>> list = (List<Map<String, Object>>) CacheMap.getValue(tagUid); if(null == list){ list = new ArrayList<Map<String,Object>>(); } //当前用户信息 Map<String, Object> map = userService.queryCustomerInfo(sendData.getSrcUid()); if(!list.contains(map)){//第一次访问,放入缓存 list.add(map); //存放缓存 CacheMap.setValue(tagUid, list); } } } } // 加入聊天室 @SuppressWarnings("unchecked") @OnEvent(value = "joinRoom") public void joinRoom(SocketIOClient client, MessageRoom sendData) { List<SocketIOClient> list = (List<SocketIOClient>) CacheMap.getValue("ROOM"); if(null == list){ list = new ArrayList<SocketIOClient>(); } if(!list.contains(client)){ list.add(client); CacheMap.setValue("ROOM", list); //在线用户列表 List<String> userList = (List<String>) CacheMap.getValue("ROOM_USERS"); if(null == userList){ userList = new ArrayList<String>(); } //新加入聊天室 if(!userList.contains(sendData.getNickname())){ userList.add(sendData.getNickname()); CacheMap.setValue("ROOM_USERS", userList); } sendData.setOnlineUsers(userList); sendData.setOnlineCount(userList.size()); } broadcast("joinRoom", sendData); } //退出聊天室 @SuppressWarnings("unchecked") @OnEvent(value = "outRoom") public void outRoom(SocketIOClient client, MessageRoom sendData) { List<SocketIOClient> list = (List<SocketIOClient>) CacheMap.getValue("ROOM"); list.remove(client); CacheMap.setValue("ROOM", list); //在线用户列表 List<String> userList = (List<String>) CacheMap.getValue("ROOM_USERS"); userList.remove(sendData.getNickname()); CacheMap.setValue("ROOM_USERS", userList); sendData.setOnlineUsers(userList); sendData.setOnlineCount(userList.size()); broadcast("outRoom", sendData); } // 聊天室聊天 @OnEvent(value = "chatRoom") public void chatRoom(SocketIOClient client, MessageRoom sendData) { broadcast("chatRoom", sendData); } //聊天室广播 private void broadcast(String cmd, MessageRoom sendData){ @SuppressWarnings("unchecked") List<SocketIOClient> list = (List<SocketIOClient>) CacheMap.getValue("ROOM"); for(SocketIOClient client: list){ client.sendEvent(cmd, sendData); } } }

xb12369 LV7
2024年11月21日
2509878298 LV5
2024年2月29日
百里守寡 LV5
2023年8月29日
你好啊呐 LV19
2023年8月23日
annazhang LV29
2023年2月17日
pureshyness LV6
2022年9月29日
骑着导弹让蜗牛追去 LV8
2022年1月16日
wanglinddad LV55
2021年12月30日
j1an01 LV6
2021年12月15日
a1677596408 LV23
2021年7月27日