【发布时间】:2015-11-09 00:16:04
【问题描述】:
我正在尝试在用户之间构建消息/聊天系统。
遵循规则是消息系统的主要特点。
- 每个用户都可以向其他用户发送消息,并且只接受一对一聊天。(这意味着只有两个用户可以共享消息)。如果有名为 A 到 Z 的用户,用户 A 可以向 B 发送消息到 Z,但所有消息都是独立的,所以它就像一对一的聊天系统。 A、B 和 C 不能在同一个消息框(聊天室)中进行对话。
- 应该实时发送/接收消息,这就是我决定使用 Socket.io 的原因
- 用户退出后,消息历史记录被保存,以便用户在他/她再次登录时可以看到它。
我认为这就是它的工作方式。
-
当用户 A 登录时,服务器使用唯一标识符为用户 A 创建一个唯一的房间,即 req Token 中的 userId。因此,每个用户在登录时都会加入一个房间。
io.sockets.on('connection', function (socket) { socket.on('join', function (data) { socket.join(data.userId); }); });现在,其他用户可以实时向用户 A 发送消息。当然用户A也可以向特定用户发送消息并实时获取消息。
io.sockets.in('userId').emit('msg', {msg: 'hi!'}); 如果用户A想给用户B发送消息,但是用户B当前没有登录,也就是说用户B没有空间,那么用户A发送的消息保存在.txt文件和文件路径中保存在数据库中。
稍后当用户B勾选消息框时,用户B可以通过加载.txt文件查看所有消息历史记录。
所以,如果用户A和B都登录了,它可以是实时聊天,如果一个用户没有登录,也可以是消息系统。
【问题讨论】:
-
为什么不将聊天保存到数据库而不是文本文件?
-
@AEonAX 我正在使用 MySQL,但我还没有看到好的做法。很多人建议我用txt文件来做。如果您推荐DB而不是文本文件,请告诉我为什么DB优于txt文件的原因?我真的不习惯。
-
因为您将只提供 1 -1 聊天。看来您只需要 DB=> 1. MsgID 2. SenderId 3. ReceiverID 4.Message 5.IsDelivered 中的这些列。以及另一个存储用户的表。然后就可以通过 ReceiverID 和 IsDelivered 字段查询
-
服务器上基于文件的方法难以保持一致性和完整性。