用户登录成功后,我将用户uid(唯一的)与client_id存放在一张表中(映射表)。当该用户再次登录时,按workerman运行机制,客户端连接到服务端,它又会自动生成一个client_id,当用户再次登录时,发给原来的client_id的信息就不能发送给该用户了。现在问题就是能否用映射表中的client_id替换掉再次登录workerman生成的client_id?还有client_id是在哪一步生成的?
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可以一对多(也就是同一个用户支持多个客户端同时登录),也可以强制一对一(同一个用户只能登录一个客户端)
已按此流程完成了client_id与client_name的对应关系,并成功实现通过name来发送消息;
GatewayWorker 增加了bindUid 和 sendToUid方法,可以直接使用,参见手册 http://workerman.net/gatewaydoc/gateway-worker-development/bind-uid.html http://workerman.net/gatewaydoc/gateway-worker-development/send-to-uid.html
用户每次的client_id都一样吗?不一样的话,怎么做映射的?一样的话,client_id生成机制是什么?
每个连接client_id不一样,一样的话就乱套了,因为没有数据交互无法确定一个新的socket连接是属于某个client_id。client_id生成机制类似自增机制。bindUid一般是客户端连接上来后发一个验证包,验证自己是哪个uid,然后和当前client_id绑定。
判断用户是否在线可以使用$mes = Gateway::getClientIdByUid($uid); 根据用户uid可以实时查出用户的clientid
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可以一对多(也就是同一个用户支持多个客户端同时登录),也可以强制一对一(同一个用户只能登录一个客户端)
已按此流程完成了client_id与client_name的对应关系,并成功实现通过name来发送消息;
GatewayWorker 增加了bindUid 和 sendToUid方法,可以直接使用,参见手册
http://workerman.net/gatewaydoc/gateway-worker-development/bind-uid.html
http://workerman.net/gatewaydoc/gateway-worker-development/send-to-uid.html
用户每次的client_id都一样吗?不一样的话,怎么做映射的?一样的话,client_id生成机制是什么?
每个连接client_id不一样,一样的话就乱套了,因为没有数据交互无法确定一个新的socket连接是属于某个client_id。client_id生成机制类似自增机制。bindUid一般是客户端连接上来后发一个验证包,验证自己是哪个uid,然后和当前client_id绑定。
判断用户是否在线可以使用$mes = Gateway::getClientIdByUid($uid); 根据用户uid可以实时查出用户的clientid