首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swoole开发聊天室时,同一个用户开多个窗口登录,产生多个fd,识别为了多个用户了,如何解决呢?
### 问题描述 ### swoole开发聊天室时,同一个用户开多个窗口登录,产生多个fd,识别为了多个用户了,如何解决呢? 现在我是用Swoole\Table建了两个内存表。 1.第一个**Table1**是用userid做为key来存,userid是字符串类型的:存fd,userid,username这些值。这个表数据我是在统计在线人数和群发消息时用到。 2.第二个**Table2**我是用fd做为key来存的,存了userid,username这些值。这个表我是用来关闭fd时用到的。因为在关闭连接时close($server, int $fd),必须要传个fd。 3.close连接时我通过这个fd去找第2个table2里的userid,找到userid去第1个table1找到对应userid进行del删除。但是场景是同一个用户开多个窗口登录,产生多个fd都存到了table2表。 问题来了table2相同用户fd如何关闭呢??table1是用userid做为key来存,应该是不会有重复的用户的,会覆盖掉吧。 请大佬评估一下这种方法是否可行呢,或者有更好的办法可以告知吗?
发布于5年前 · 41 次浏览 · 来自
提问
Dragonsu
### 问题描述 ### swoole开发聊天室时,同一个用户开多个窗口登录,产生多个fd,识别为了多个用户了,如何解决呢? 现在我是用Swoole\Table建了两个内存表。 1.第一个**Table1**是用userid做为key来存,userid是字符串类型的:存fd,userid,username这些值。这个表数据我是在统计在线人数和群发消息时用到。 2.第二个**Table2**我是用fd做为key来存的,存了userid,username这些值。这个表我是用来关闭fd时用到的。因为在关闭连接时close($server, int $fd),必须要传个fd。 3.close连接时我通过这个fd去找第2个table2里的userid,找到userid去第1个table1找到对应userid进行del删除。但是场景是同一个用户开多个窗口登录,产生多个fd都存到了table2表。 问题来了table2相同用户fd如何关闭呢??table1是用userid做为key来存,应该是不会有重复的用户的,会覆盖掉吧。 请大佬评估一下这种方法是否可行呢,或者有更好的办法可以告知吗?
赞
2
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-06-17
Rango
你的方法没问题,但这个问题可能需要你自己思考明白,`Swoole`底层只是提供了连接管理的能力,而你提到的是你产品的业务逻辑了。你可以用 `Table` 或者 `Redis` 存储 `uid` 和 `fd` 的互相映射关系,通过 `uid` 可以查到对应的 `fd` ,也可以通过`fd` 查到 `uid`。 - 允许多终端登录:`uid` 和 `fd` 一对多的关系,用户退出登录时,需要同时遍历此`uid`下所有`fd`,并切断连接 - 不允许多终端登录:`uid` 和 `fd` 一对一的关系,用户登录时查询`uid`对应的`fd`,如果有表示用户已经有一个连接了,可以切断,然后更新对应关系
赞
3
回复
2021-06-16
Rango
你不能用 fd 作为用户的唯一标识符,fd 只是连接的标识符。如果你允许一个多终端登录,那么一个 用户 (uid)应该是对应多个 fd,如果不支持多终端登录,那么 uid 和 fd 应该是一一对应的,如果有新的连接到来,需要关闭老的 fd 对应的连接。
赞
2
回复
2021-06-16
Dragonsu
回复
Rango
很高兴你能解答,感谢你。现在我是用Swoole\Table建了两个内存表,1.第一个table1是用userid做为key来存,userid是字符串类型的:存fd,userid,username这些值。 这个表数据我是在统计在线人数和群发消息时用到。 2.第二个table2我是用fd做为key来存的,存了userid,username这些值。这个表我是用来关闭fd时用到的。因为在关闭连接时close($server, int $fd),必须要传个fd。然后我通过这个fd去找第2个table2里的userid,找到userid去第1个table1找到fd进行del删除。但是场景是同一个用户开多个窗口登录,产生多个fd都存到了table2表,问题来了table2相同用户fd如何关闭呢??table1是用userid做为key来存,应该是不会有重复的用户的,会覆盖掉吧。 请大佬评估一下这种方法是否可行呢,或者有更好的办法可以告知吗?
赞
1
回复
2021-06-16
鲁飞
https://wiki.swoole.com/#/server/methods?id=bind
赞
1
回复
2021-06-16
Dragonsu
回复
鲁飞
非常感谢你的回答。uid是指用户账号吗,我用户账号是字符串,如何与fd绑定呢
赞
1
回复
2021-06-17
yiyi
顶号的时候,先查一下table1有没有这个uid,有就把对应原先的fd主动close,这样onclose的时候就会把table2的fd数据删除,更新table1的fd为新fd即可
赞
1
回复