102 lines
4.3 KiB
Java
102 lines
4.3 KiB
Java
|
package com.cf.chat.netty;
|
|||
|
|
|||
|
import com.alibaba.fastjson.JSON;
|
|||
|
import com.cf.chat.domain.CfUserMessage;
|
|||
|
import com.cf.chat.domain.Message;
|
|||
|
import com.cf.chat.service.CfUserGroupMessageService;
|
|||
|
import com.cf.chat.service.CfUserMessageService;
|
|||
|
import com.cf.framework.domain.message.response.MessageCode;
|
|||
|
import com.cf.framework.domain.ucenter.ext.UserBasicInfo;
|
|||
|
import com.cf.framework.domain.ucenter.response.AuthCode;
|
|||
|
import com.cf.framework.exception.ExceptionCast;
|
|||
|
import com.cf.framework.utils.SpringUtil;
|
|||
|
import io.netty.channel.Channel;
|
|||
|
import io.netty.channel.ChannelHandlerContext;
|
|||
|
import io.netty.channel.SimpleChannelInboundHandler;
|
|||
|
import io.netty.channel.group.ChannelGroup;
|
|||
|
import io.netty.channel.group.DefaultChannelGroup;
|
|||
|
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
|||
|
import io.netty.util.concurrent.GlobalEventExecutor;
|
|||
|
|
|||
|
import java.net.InetSocketAddress;
|
|||
|
import java.net.SocketAddress;
|
|||
|
import java.text.SimpleDateFormat;
|
|||
|
|
|||
|
/**
|
|||
|
* 处理消息的handler
|
|||
|
* TextWebSocketFrame: 在netty中,是用于为websocket专门处理文本的对象,frame是消息的载体
|
|||
|
*/
|
|||
|
public class ChatHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
|
|||
|
|
|||
|
// 用来保存所有的客户端连接
|
|||
|
private static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
|
|||
|
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:MM");
|
|||
|
|
|||
|
// 当Channel中有新的事件消息会自动调用
|
|||
|
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
|
|||
|
// 当接收到数据后会自动调用
|
|||
|
|
|||
|
// 获取客户端发送过来的文本消息
|
|||
|
Message message = JSON.parseObject(msg.text(), Message.class);
|
|||
|
|
|||
|
// 通过SpringUtil工具类获取Spring上下文容器
|
|||
|
CfUserMessageService cfUserMessageService = SpringUtil.getBean(CfUserMessageService.class);
|
|||
|
CfUserGroupMessageService cfUserGroupMessageService = SpringUtil.getBean(CfUserGroupMessageService.class);
|
|||
|
UserBasicInfo userBasicInfo = cfUserMessageService.getBaseUserInfoByToken(message.getToken());
|
|||
|
switch (message.getType()) {
|
|||
|
case "create_link":
|
|||
|
UserChannelMap.put(userBasicInfo.getId(), ctx.channel());
|
|||
|
UserChannelMap.print();
|
|||
|
Thread messageThread = new Thread(new Runnable() {
|
|||
|
@Override
|
|||
|
public void run() {
|
|||
|
cfUserMessageService.getNotReadMessage(userBasicInfo.getId());
|
|||
|
}
|
|||
|
});
|
|||
|
messageThread.start();
|
|||
|
Thread groupMessageThread = new Thread(new Runnable() {
|
|||
|
@Override
|
|||
|
public void run() {
|
|||
|
cfUserGroupMessageService.getNotReadMessage(userBasicInfo.getId());
|
|||
|
}
|
|||
|
});
|
|||
|
groupMessageThread.start();
|
|||
|
break;
|
|||
|
case "send_message":
|
|||
|
CfUserMessage _message = message.getCfUserMessage();
|
|||
|
_message.setFromUid(userBasicInfo.getId());
|
|||
|
SocketAddress socketAddress = ctx.channel().remoteAddress();
|
|||
|
String ip = socketAddress.toString();
|
|||
|
ip = ip.substring(1,ip.indexOf(":"));
|
|||
|
_message.setIp(ip);
|
|||
|
cfUserMessageService.sendMessage(_message);
|
|||
|
break;
|
|||
|
case "change_status":
|
|||
|
cfUserMessageService.updateStatus(userBasicInfo.getId(),
|
|||
|
message.getCfUserMessage().getId(),1);
|
|||
|
break;
|
|||
|
case "heartbeat_check":
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 当有新的客户端连接服务器之后,会自动调用这个方法
|
|||
|
@Override
|
|||
|
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
|
|||
|
// 将新的通道加入到clients
|
|||
|
clients.add(ctx.channel());
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
|||
|
UserChannelMap.removeByChannelId(ctx.channel().id().asLongText());
|
|||
|
ctx.channel().close();
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
|
|||
|
System.out.println("关闭通道");
|
|||
|
UserChannelMap.removeByChannelId(ctx.channel().id().asLongText());
|
|||
|
UserChannelMap.print();
|
|||
|
}
|
|||
|
}
|