Erlang 聊天室程序(八) 主题房间---supervisor 的使用

        之前实现的功能相当于一个大厅,这里我们为这个聊天室程序添加“主题房间的功能”。客户端登陆后处于大厅中,然后获取目前所有的主题房间,再发送消息进入到某个房间内。同一房间的成员可见,发送的消息也只限本房间可见。

        为了管理这些房间,Erlang Opt中的监控树是最合适的。

        新建一个模块room_manager.erl 其行为遵守gen_supervisor,子进程为chat_room

            再添加一个方法用于启动这个supervisor


            如果现在就直接启动这个模块是没有问题的,但既然是主题房间,肯定不止一个吧。下面就为这个supervisor添加再启动主题房间的功能:          就这么简单? 肯定不是。还有以下几点需要考虑:

          1.如何标识每个房间的信息,如名称、类型、编号、启动时间、当前用户数等。

          2.如何维护每个房间的在线用户信息。

          3.如何维护当前可用的主题房间的信息。

          4.如何从大厅进入房间。

          5.如何从房间退出到大厅。

          6.如何将信息路由到自己所在的房间。

         下面就一个一个地解决:

          房间的标识:

          如上代码启动主题房间的时候传入了Para参数,可以通过这个参数来初始化任何你需要的房间信息。PS: 这就是Erlang 的好处之一啊大笑

         修改chat_room.erl

定义一个record叫roominfo

用传入进来的参数初始化房间信息


          每个房间的在线成员信息维护:

          还记得client_manager这个模块否?这个模块就是用来专门管理房间对应的在线成员的,这里需要对其进行修改。

          在前面的代码中client_manager这个模块的调用是与chat_room处于同一进程内的,也就是顺序性调用。

          每次调用时所操纵的表是写死的,在这里需要改为动态的,在每次操纵时传入要操纵的表。

          所以应该在chat_room中保存自己拥有的表名。

         修改roominfo的定义添加tablename,并在初始化chat_room时生成好。

         修改client_manger.erl为每个方法都添加table参数。


           再修改chat_room.erl中调用部分,为每个调用都添加table参数。


        如此即可。注:client_manager有一个getNick/1 函数,负责返回对应ID用户的昵称。如何从正确的表格中找出用户的昵称?这个问题将留在用户消息路由部分去处理。

        暂时到这。





posted on   心笑峰  阅读(1804)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2012年3月 >
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7
点击右上角即可分享
微信分享提示