项目9-网页聊天室7(消息传输模块之解决之前存在的问题:获取最后一条消息)

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值