首页>代码>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
13小时前
2509878298 LV5
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日
最近浏览更多
xb12369 LV7
13小时前
krispeng LV13
8月31日
xainyun
8月27日
暂无贡献等级
Luck_ZDM LV12
5月22日
long123_356 LV7
5月18日
Annie123
5月7日
暂无贡献等级
taoyi123 LV17
4月29日
heweimin LV13
4月7日
3334004690 LV10
3月20日
2509878298 LV5
2月29日