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 {
    @Autowired
    private MessageSessionMapper messageSessionMapper;
    @Autowired
    private 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 查询数据库,查出来有哪些会话id
        List<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);





















