1.服务器中转的原因
IPV4不够用
(1)使用服务器中转,最大原因, 就是 NAT 背景下,两个内网的设备无法直接进行通信(不在同一个局域网内)
(2)另外一个原因,通过服务器中转,是更容易在服务器这里记录历史消息随时方便咱们来查询历史记录.
2.数据库的设计
-- 消息表
drop table if exists message;
create table message (
messageId int primary key auto_increment,
-- 谁发的
fromId int,
-- 发给哪个会话
sessionId int,
-- 消息正⽂
content varchar(2048),
-- 发送时间
postTime datetime
);
insert into message values(1, 1, 1, '今晚吃啥?', '2038-01-01 00:00:00');
insert into message values(2, 2, 1, '随便', '2038-01-01 00:02:00');
insert into message values(3, 1, 1, '那吃面?', '2038-01-01 00:03:00');
insert into message values(4, 2, 1, '不想吃', '2038-01-01 00:04:00');
insert into message values(5, 1, 1, '那吃啥?', '2038-01-01 00:05:00');
insert into message values(6, 2, 1, '随便', '2038-01-01 00:06:00');
insert into message values(7, 1, 2, '晚上约不约?', '2038-01-01 00:00:00');
3.获取会话的最后一条消息
// 4.遍历会话id,查询出每个会话的最后一条消息// 有可能查不到消息的情况String lastMessage=messageMapper.getLastMessageBySessionId(userIds);if(lastMessage==null){messageSession.setLastMessage("");}else {messageSession.setLastMessage(lastMessage);}// 最终目标就是构造出一个MessageSession 对象数组messageSessionList.add(messageSession); // messageSession.setLastMessage("最后一条信息"); // messageSessionList.add(messageSession);}
4.获取会话的历史消息
4.1 约定前后端接口
4.2 Controller
@RestController
@RequestMapping("/session")
public class MessageSessionController {@Autowiredprivate MessageSessionMapper messageSessionMapper;@Autowiredprivate MessageMapper messageMapper;@RequestMapping("/getSessionMessage")public Result getSessionMessage(HttpSession httpSession){//0.先构造返回的数据List<MessageSession> messageSessionList=new ArrayList<>();//1.获取到当前用户的userId(从spring的session 中获取)User user=(User) httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);Integer userId= user.getUserId();//拦截器已经做了相关操作// 2.根据userId 查询数据库,查出来有哪些会话idList<Integer> sessionId=messageSessionMapper.getSessionIdsByUserId(userId);// 3.遍历会话id,查询出每个会话里涉及到的好友都有谁for(Integer userIds:sessionId){/*public class MessageSession {private Integer sessionId;private List<Friend> friends;private String lastMessage;}*/MessageSession messageSession=new MessageSession();messageSession.setSessionId(userIds);messageSession.setFriends(messageSessionMapper.getFriendBySessionId(userIds,userId));// 4.遍历会话id,查询出每个会话的最后一条消息// 有可能查不到消息的情况String lastMessage=messageMapper.getLastMessageBySessionId(userIds);if(lastMessage==null){messageSession.setLastMessage("");}else {messageSession.setLastMessage(lastMessage);}// 最终目标就是构造出一个MessageSession 对象数组messageSessionList.add(messageSession);
// messageSession.setLastMessage("最后一条信息");
// messageSessionList.add(messageSession);}return Result.success(messageSessionList);}
将原来固定的最后一条消息,修改为动态的。
4.3 MAPPER
//获取指定会话最后一条消息@Select("select content from message where sessionId=#{sessionId} order by postTime desc limit 1")public String getLastMessageBySessionId(Integer sessionId);