关于workerman-chat的client_id

0
// 登录
var login_data = JSON.stringify({"type":"login","client_name":name,"room_id":<?php echo isset($_GET) ? $_GET : 1?>});
console.log("websocket握手成功,发送登录数据:"+login_data);
ws.send(login_data);
reconnect = true;

这是chat首页登录的逻辑。这里我想在login_data中增加一项例如userid:12345,并用这个userid生成对应的client_id,请问ws.send(login_data)后我该如何处理?后端如何获取ws发送的内容?

已邀请:

helloworld

赞同来自:

// 全局唯一client_id
$global_client_id = $this->createGlobalClientId();
$this->clientConnMap = $fd;
$this->connClientMap = $global_client_id;

这个是默认的client_id生成逻辑。如何获取ws发送的userid呢???求指导

walkor

赞同来自:

登录时想向workerman-chat传递任何数据,在login_data加即可。
js调用 ws.send 发送的数据都在workerman/applications/Chat/Event.php中的onMessage方法里面接收,login_data也是在这里接收解析。


workerman-chat默认没有userid概念,全部以client_id作为客户端标记相互发送数据。client_id可以看做Web开发中的session_id,每个网页的连接的client_id都不一样(类似Web程序中每次用户登录session_id都不一样)。


如果想让workerman-chat中的用户与现有其他项目中的用户关联起来,可以在workerman-chat登录发送给workerman的login_data加入用户识别信息(例如你说的userid,实际上这样不安全,容易被伪造。比较安全的做法是login_data中放入登录用户的Web程序的session_id,workerman收到Web程序的session_id来验证用户,识别方法一般是Web登录时保存session_id与用户信息的关系),当workerman-chat识别当前用户后,可以使用workerman提供的$_SESSION机制(和Web的$_SESSION类似)记录当前用户用户的信息,例如$_SESSION=xx;$_SESSION=xxx;...,当需要当前用户的信息时直接从$_SESSION中取即可,非常方便。


如果想通过userid来获得client_id,你需要一个存储来记录userid和client_id的对应关系,可以限制一对一或者一对多(根据自己业务情况确定)。

要回复问题请先登录注册