【发布时间】:2012-02-09 09:30:31
【问题描述】:
我正在构建一个允许用户托管房间的一对一聊天应用程序。只是为了提供更多反馈:
用户创建房间(房间是公开的,任何人都可以查看,但如果用户尚未注册,聊天将被禁用并提示用户注册聊天。)
其他用户注册房间
用户根据注册顺序与主机聊天
我想显示主机是否在线。或者更进一步,显示主持人是否在房间内。
我不知道该怎么做。
【问题讨论】:
标签: php mysql codeigniter
我正在构建一个允许用户托管房间的一对一聊天应用程序。只是为了提供更多反馈:
用户创建房间(房间是公开的,任何人都可以查看,但如果用户尚未注册,聊天将被禁用并提示用户注册聊天。)
其他用户注册房间
用户根据注册顺序与主机聊天
我想显示主机是否在线。或者更进一步,显示主持人是否在房间内。
我不知道该怎么做。
【问题讨论】:
标签: php mysql codeigniter
基本上,这些工作如下。
每次用户采取行动(聊天刷新、发送消息、访问的页面等)时,与用户关联的令牌(例如保存在您的服务器、数据库中的令牌)都会更新为当前时间。
| User ID | Last action |
-------------------------------------
| 14 (mark) | 2012-02-09-10:34:53 |
| 56 (phil) | 2012-02-09-09:12:34 |
| 9 (john) | 2012-02-09-10:33:11 |
然后,如果用户的令牌不是太旧(5/10 分钟?),那么您决定用户 在线
如果您使用 AJAX 每 1 分钟左右向服务器发送一个定期请求,您可以改进此方法。此 AJAX 请求更新令牌值。因此,通过这种方式,您可以告诉用户是否在线,如果他什么都不做,只是盯着页面。当他退出(关闭浏览器或选项卡)时,AJAX 定期调用停止工作,因此 5/10 分钟后用户被宣布离线。
祝你好运!
【讨论】:
假设你有 5 个人在房间里(并且肯定有一个或更多人处于活动状态),请执行以下操作:
反过来发送那个动作(我想通过ajax),服务器的回复是那个房间里在线和不在线的用户列表。通过将当前时间与内部每个用户的上次活动时间进行比较(当前时间 - 上次活动时间 = 离开时间)
知道谁在线,谁不在线,在浏览器中重建“聊天对象列表”
您可以实现多种可能性。比如说允许 5 分钟,否则,该用户处于空闲状态。如果时间差 15 分钟或更多,则认为该人离开。
您还可以更进一步,通过 ping 服务器以了解谁定期在线的更新,或者称为“心跳”,而不必通过击键或发送每条消息来完成。过程相同:告诉服务器你在线,记录你的存在,并让它返回一个聊天伙伴列表。
请注意,在此应用程序(浏览器聊天)中,服务器无法知道您离线、关闭浏览器等。这就是您需要“心跳”以及定期记录您的操作的原因。
至于主机......你应该用主机ID标记那个房间,心跳会告诉你他是否仍然在线。
【讨论】: