首页>代码>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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友