java netty html_spring boot+mvc+mybatis+netty-sokey.io+html+js实现简单即时通讯聊天系统

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 clientMap = new HashMap();

@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 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> list = (List>) CacheMap.getValue(tagUid);

if(null == list){

list = new ArrayList>();

}

//当前用户信息

Map 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 list = (List) CacheMap.getValue("ROOM");

if(null == list){

list = new ArrayList();

}

if(!list.contains(client)){

list.add(client);

CacheMap.setValue("ROOM", list);

//在线用户列表

List userList = (List) CacheMap.getValue("ROOM_USERS");

if(null == userList){

userList = new ArrayList();

}

//新加入聊天室

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 list = (List) CacheMap.getValue("ROOM");

list.remove(client);

CacheMap.setValue("ROOM", list);

//在线用户列表

List userList = (List) 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 list = (List) CacheMap.getValue("ROOM");

for(SocketIOClient client: list){

client.sendEvent(cmd, sendData);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值