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