car-park/cf-chat/cf-chat-service/src/main/java/com/cf/chat/netty/ChatHandler.java

102 lines
4.3 KiB
Java
Raw Normal View History

2020-06-18 14:39:34 +08:00
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();
}
}