本文共 4592 字,大约阅读时间需要 15 分钟。
在QQ使用过程中,我们都知道可以通过添加好友来建立联系,而好友列表的管理功能也是日常使用中常见的操作。本文将详细描述仿QQ通信系统中好友添加流程及其后台数据结构的实现。
这个项目旨在模拟QQ的通信功能,主要实现包括:
接下来,我们将详细分析好友添加功能的实现过程,包括客户端和服务器端的逻辑。
public static String getUserName(int JKnum) { UserInfo user = userDB.get(JKnum); if (user == null) { return null; } else { return user.getnickName(); }}
服务器响应好友查找结果服务器端查找好友2,并根据好友信息库返回好友昵称和JKnum。
客户端1发送好友添加请求客户端1收到好友昵称后,会发送好友加入请求,消息包内容包括:
public class addFriendMsg extends MSHead { private String checkMsg; // 好友验证信息 private String senderName; // 发送方昵称 private String group; // 发送方的分组名 public addFriendMsg(int len, byte type, int dest, int src, String checkMsg, String senderName, String group) { super(len, type, dest, src); this.checkMsg = checkMsg; this.senderName = senderName; this.group = group; } // ...其他方法}
// 每个用户的信息存储包括:private HashMap> groups = new HashMap<>(); // 好友分组信息private ArrayList groupName = new ArrayList<>(); // 分组名称列表// 添加好友分组public void addGroup(String groupName) { this.groupName.add(groupName); this.groups.put(groupName, new ArrayList<>());}// 删除好友分组public void deleteGroup(String groupName) { this.groupName.remove(groupName); this.groups.remove(groupName);}
// 新增好友public void addFriend(int friendJKnum, String group) { if (this.groups.containsKey(group)) { this.groups.get(group).add(friendJKnum); }}
// 查找好友public static String getUserName(int JKnum) { UserInfo user = userDB.get(JKnum); if (user == null) { return null; } else { return user.getnickName(); }}// 互加好友public static void addFriend(int JKnum1, int JKnum2, String group1, String group2) { // 获取用户信息 UserInfo user1 = userDB.get(JKnum1); UserInfo user2 = userDB.get(JKnum2); // 增加好友 user1.addFriend(JKnum2, group1); user2.addFriend(JKnum1, group2);}
public enum MSGType { // 好友查询消息 SEARCH(0x08), // 好友查询应答消息 SEARCH_RES(0x18), // 好友申请消息 ADD_FRIEND(0x09), // 好友申请应答消息 ADD_FRIEND_RES(0x19), // 其他消息类型 USER_INFO(0x03);}
// 消息打包逻辑public static byte[] packMsg(Message msg) { MsHead head = (MsHead) msg; byte[] bytes = new byte[head.getLength()]; System.arraycopy(head.getBytes(), 0, bytes, 0, head.getLength()); return bytes;}
// 消息解包逻辑public Message unpackMsg(byte[] data) { try { int len = data[0] & 0xFF; int type = data[1] & 0xFF; int dest = data[2] & 0xFF; int src = data[3] & 0xFF; Message msg = createMsg(type, dest, src, len); // 处理消息体 if (type == SEARCH) { // 解析好友查询消息 int friendInSearch = DataIO.toInt8(data, 4); msg = new SearchFriendMsg(len, type, dest, src, friendInSearch); } else if (type == SEARCH_RES) { // 解析好友查询响应消息 byte result = data[4]; String findName = DataIO.readStr(data, 5, 10); msg = new SearchFriendResMsg(len, type, dest, src, result, findName); } else if (type == ADD_FRIEND) { // 解析好友申请消息 String checkMsg = DataIO.readStr(data, 5, 256); String senderName = DataIO.readStr(data, 265, 10); String group = DataIO.readStr(data, 275, 10); msg = new AddFriendMsg(len, type, dest, src, checkMsg, senderName, group); } else if (type == ADD_FRIEND_RES) { // 解析好友申请响应消息 byte res = data[4]; if (res == 0) { String groupMe = DataIO.readStr(data, 5, 10); String groupFriend = DataIO.readStr(data, 15, 10); msg = new AddFriendResMsg(len, type, dest, src, res, groupMe, groupFriend); } else { msg = new AddFriendResMsg(len, type, dest, src, res); } } else { // 其他消息类型 msg = super.universalPack(data, 4); } return msg; } catch (Exception e) { System.out.println("解包失败:" + e.getMessage()); return null; }}
客户端1输出:
已收到好友确认消息,好友名青年莫言已加入你的默认分组。
客户端2输出:
已收到好友添加请求,用户认证通过,已将对方添加至默认分组。
通过以上实现,我们成功完成了仿似QQ的好友查询与添加功能。在实际应用中,可以根据需要扩展更多功能,如群组管理员权限、好友黑名单等,为整体的即时通讯系统打下坚实基础。
转载地址:http://kzdyk.baihongyu.com/