如何给离线用户留言

jy03204340

如何给离线用户留言,我要做一个好友聊天系统,要做到可以跟在线用户一对多聊天,可以给离线的用户留言,请问workerman能做到吗?

3384 3 0
3个回答

jy03204340

补充,跟在线用户一对多聊天,这个我已经做出来了,另外,给离线的用户留言,这个怎么做?

  • 暂无评论
jy03204340

再补充,由于worker是自动生成client_id的,我如何才能摒弃掉client_id,用自定义的一个字段替代Client_id呢,这也是我为什么不能走给离线用户留言的原因,因为离线用户没有client_id,所以我无法给离线用户留言,假定已知该离线用户的姓名,且是唯一的,是否可以替代client_id,又如何替代,求walkor大神帮忙解答。

  • 暂无评论
walkor

如果用户名唯一,可以把用户名当做用户的唯一标识

可以用存储做一个user_name到client_id的映射,类似下面(user_name 与 client_id是一对多还是一对一由业务决定)

user_name | client_id
小明 | 3007
小红 | 3008

登录时:将user_name传递给workerman,这时workerman能够得到当前user_name和client_id,把这个信息记录到映射表
发言时:可以通过Gateway::isOnline($client_id)判断对应的用户是否在线,不在线根据client_id查询映射表的用户名,就能知道是给哪一个用户发的消息,将消息放入未读消息表中(字段大概是 user_name | form_user_name | time | content)
下线用户再次登录时:同样将user_name传递给workerman,workerman从未读消息表中找这个user_name是否有未读消息,把消息取出来调用Gateway::sendToClient($client_id)发送给当前用户

大致过程如上,细节需要根据自己的业务推敲

  • coolbosyen 2014-12-06

    映射表是不是最好使用memcache存储

  • coolbosyen 2014-12-06

    还有一个问题,是不是用户再次登录时,先通过username来查询是否有client_id,如果有workerman不自动生成client_id,如果没有workerman自动生成client_id,并将username和client_id保存到映射表。如果是这样的话,在哪里可以控制workerman自动生成client_id

  • walkor 2014-12-07

    client_id无法自定义,每次用户登录时更新或者插入映射表中的client_id,退出时根据client_id删除对应的记录

  • jy03204340 2014-12-23

    @1:3Q,谢谢walkor大神的指点!

年代过于久远,无法发表回答
🔝