原标题:【附源码】用Java写了一个类QQ界面聊天小项目,可在线聊天!
目录:
1.功能实现
2.模块划分
3.使用到知识
4.部分代码实现
5.运行例图
1.功能实现
1.修改功能(密码、昵称、个性签名)
2.添加好友、删除好友
3.单聊功能
4.判断好友是否在线
2.模块划分
3.使用的知识
netty
swing
集合等同步阻塞队列synchronousQueue
数据库MySQL中的CRUD
C3p0连接池
JSON字符串4.部分代码实现
1.nettyController.java
接收到来自客户端的消息,与dao层进行交互
dao层与之数据库进行交互
修改密码
添加好友
从添加好友逻辑实现上我走了很多的弯路频繁的访问数据库,这是一件很不好的事情
packagechat.Project.controller;
importchat.Project.bean.information;
importchat.Project.constant.EnMsgType;
importchat.Project.dao.*;
importchat.utils.CacheUtil;
importchat.utils.JsonUtils;
importcom.fasterxml.jackson.databind.node.ObjectNode;
importio.netty.channel.Channel;
importjava.util.ArrayList;
importjava.util.Iterator;
publicclassNettyController{
privatestaticUserDao userDao = newUserDaoImpl;
privatestaticinformationDao informationDao = newinformationDaoImpl;
privatestaticfriendDao friendDao = newfriendDaoImpl;
publicstaticString processing(String message, Channel channel){
//解析客户端发送的消息
ObjectNode jsonNodes = JsonUtils.getObjectNode(message);
String msgtype = jsonNodes.get( "msgtype").asText;
if(EnMsgType.EN_MSG_LOGIN.toString.equals(msgtype)){
//登录操作
returnloginOperation(jsonNodes,channel);
} elseif(EnMsgType.EN_MSG_MODIFY_SIGNATURE.toString.equals(msgtype)){
//修改签名
returnmodifySignature(jsonNodes);
} elseif(EnMsgType.EN_MSG_MODIFY_NICKNAME.toString.equals(msgtype)){
//修改昵称
returnmodifyNickname(jsonNodes);
} elseif(EnMsgType.EN_MSG_GETINFORMATION.toString.equals(msgtype)){
//获取登录信息
returngetInformation(jsonNodes);
} elseif(EnMsgType.EN_MSG_VERIFY_PASSWORD.toString.equals(msgtype)){
//进行修改密码
returnverifyPasswd(jsonNodes);
} elseif(EnMsgType.EN_MSG_CHAT.toString.equals(msgtype)){
//单聊模式
returnSingleChat(jsonNodes);
} elseif(EnMsgType.EN_MSG_GET_ID.toString.equals(msgtype)){
//获取id
returngetId(jsonNodes);
} elseif(EnMsgType.EN_MSG_GET_FRIEND.toString.equals(msgtype)){
//获取好友列表
returngetFriend(jsonNodes);
} elseif(EnMsgType.EN_MSG_ADD_FRIEND.toString.equals(msgtype)){
//添加好友
returnaddFriends(jsonNodes);
} elseif(EnMsgType.EN_MSG_DEL_FRIEND.toString.equals(msgtype)){
//删除好友
returndelFriend(jsonNodes);
} elseif(EnMsgType.EN_MSG_ACTIVE_STATE.toString.equals(msgtype)){
//判断好友的在线状态
returnfriendIsActive(jsonNodes);
}
return"";
}
//判断好友在线状态
privatestaticString friendIsActive(ObjectNode jsonNodes){
intfriendId = jsonNodes.get( "friendId").asInt;
ObjectNode objectNode = JsonUtils.getObjectNode;
objectNode.put( "msgtype",EnMsgType.EN_MSG_ACK.toString);
objectNode.put( "srctype",EnMsgType.EN_MSG_ACTIVE_STATE.toString);
//客户端保证用户独立存在且是好友
Channel channel = CacheUtil.get(friendId);
//判断用户是否在线
if(channel == null){
//用户不在线
objectNode.put( "code", 200);
} else{
//用户在线
objectNode.put( "code", 300);
}
returnobjectNode.toString;
}
//添加好友
privatestaticString delFriend(ObjectNode jsonNodes){
Integer friendId = jsonNodes.get( "friendId").asInt;
intuserId = jsonNodes.get( "id").asInt;
String localName = jsonNodes.get( "localName").asText;
//封装发回客户端的JSON
ObjectNode objectNode = JsonUtils.getObjectNode;
objectNode.put( "msgtype",EnMsgType.EN_MSG_ACK.toString);
objectNode.put( "srctype",EnMsgType.EN_MSG_DEL_FRIEND.toString);
objectNode.put( "code", 200);
//验证是否存在当前好友
information information = informationDao.getInformation(friendId);
String friendName = information.getNickname;
//查询自己是否有该好友
booleanexist = friendDao.isExist(friendName,userId);
if(exist){
//存在当前好友进行删除操作
friendDao.delFriend(userId,friendName);
friendDao.delFriend(friendId,localName);
objectNode.put( "code", 300);
}
returnobjectNode.toString;
}
//添加好友
privatestaticString addFriends(ObjectNode jsonNodes){
Integer friendId = jsonNodes.get( "friendId").asInt;
intuserId = jsonNodes.get( "id").asInt;
String localName = jsonNodes.get( "localName").asText;
//验证是否有ID