关于用户ID与workerman自动生成的client_id映射

coolbosyen

用户登录成功后,我将用户uid(唯一的)与client_id存放在一张表中(映射表)。当该用户再次登录时,按workerman运行机制,客户端连接到服务端,它又会自动生成一个client_id,当用户再次登录时,发给原来的client_id的信息就不能发送给该用户了。现在问题就是能否用映射表中的client_id替换掉再次登录workerman生成的client_id?还有client_id是在哪一步生成的?

22585 4 0
4个回答

walkor

workerman中得client_id无法自定义,每次客户端连接workerman的那一时刻会生成一个新的全局唯一的clent_id。

如果你要加入uid的概念,可以做映射表,uid<->client_id,通讯的时候使用uid通讯,封装一个类似Gateway::sendToUid($uid, $message)的接口,接口内部实现就是通过uid查找client_id,然后调用workerman自己的Gateway::sendToClient($client_id, $message)发送

每次用户登录时把uid与client_id的映射关系写入数据库,用户退出时通过client_id把映射记录删除。uid与client_id可以一对多(也就是同一个用户支持多个客户端同时登录),也可以强制一对一(同一个用户只能登录一个客户端)

  • 暂无评论
xmfail

已按此流程完成了client_id与client_name的对应关系,并成功实现通过name来发送消息;

  • 暂无评论
walkor
  • dreamboycx 2015-12-22

    用户每次的client_id都一样吗?不一样的话,怎么做映射的?一样的话,client_id生成机制是什么?

  • walkor 2015-12-22

    每个连接client_id不一样,一样的话就乱套了,因为没有数据交互无法确定一个新的socket连接是属于某个client_id。client_id生成机制类似自增机制。bindUid一般是客户端连接上来后发一个验证包,验证自己是哪个uid,然后和当前client_id绑定。

annydaniel

判断用户是否在线可以使用$mes = Gateway::getClientIdByUid($uid); 根据用户uid可以实时查出用户的clientid

  • 暂无评论
年代过于久远,无法发表回答
🔝