首页>代码>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日
最近浏览更多
lvyga1  LV2 2月24日
xianyu091012  LV5 2024年12月26日
xb12369  LV7 2024年11月21日
krispeng  LV14 2024年8月31日
xainyun 2024年8月27日
暂无贡献等级
Luck_ZDM  LV12 2024年5月22日
long123_356  LV8 2024年5月18日
Annie123 2024年5月7日
暂无贡献等级
taoyi123  LV17 2024年4月29日
heweimin  LV13 2024年4月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友