`
yjl49
  • 浏览: 114260 次
社区版块
存档分类
最新评论

Erlang 聊天室程序(九) 主题房间2 ---房间信息管理

阅读更多

 

接着上一篇,这次处理“维护当前可用的主题房间信息”问题。 每次使用startChild启动子进程的时候将当前的房间信息保存到ets表中。更重要的是每次主题房异常退出或重启都要更新对应的信息。

         修改room_manager.erl中的内容:

新建一个函数来初始化房间信息表:

initTab()->
        ets:new(roominfo,[public,
             ordered_set,
             named_table,
            {keypos,#roominfo.id}
        ])
.

  再添加对房间表数据操作的方法

addRoomInfo(Record)->
    #roominfo{name=Name,type=Type}=Record,
    case isRoomUniq([],Name,Type)of
        {found,_Id}->
            {fail,room_exists};
        {not_found}->            
            RoomId=id_generator:getnewid("room"),
            ClientTableName=list_to_atom(?PRIFIX++integer_to_list(RoomId)),
            Info=Record#roominfo{id=RoomId,tablename=ClientTableName},        
            ets:insert(roominfo, Info),
            {success,Info}
    end
.

setRoomAvailble(Id)->
    case ets:lookup(roominfo, Id) of
        Record->
            ets:update_element(roominfo, Id, {#roominfo.status,1}),
            ok;
        []->
            ok
    end
.

setRoomUnavailble(Id)->
    case ets:lookup(roominfo, Id) of
        Record->
            ets:update_element(roominfo, Id, {#roominfo.status,0}),
            ok;
        []->
            ok
    end
.
removeRoom(Id)->
    ets:delete(roominfo, Id)
.

 

为了方便后面的操作,再提供两个方法,一个根据给定的属性获取对应的ID,一个是判断对应ID的房间是否存在:

getRoomProperty(Id,Proper)->
    case ets:lookup(roominfo, Id) of
        Record->
            #roominfo{name=Name,
                      type=Type,
                      unum=Unum,
                      tablename=Tab,
                      status=Status,
                      creationDate=Crdate}=Record,            
            case Proper of
                #roominfo.name->
                    {ok,Name};
                #roominfo.type->
                    {ok,Type};
                #roominfo.unum->
                    {ok,Unum};
                #roominfo.tablename->
                    {ok,Tab};
                #roominfo.status->
                    {ok,Status};
                #roominfo.creationDate->
                    {ok,Crdate};
                _Els->
                    {fail,illegal_property}
            end;        
        _Els->
            {fail,not_found}
    end    
.

isRoomUniq([],Name,Type)->
    case ets:all(roominfo) of
        [R|L]->
            #roominfo{id=Id,name=TheName,type=TheType}=R,
            case string:equal("Name",TheName) and string:equal(Type, TheType) of
                true->
                    {found,Id};
                false->
                    isRoomUniq([L],Name,Type)        
            end;
        []->
            {not_found}
    end
;
isRoomUniq([L],Name,Type)->
    case ets:all(roominfo) of
        [R|L]->
            #roominfo{id=Id,name=TheName,type=TheType}=R,
            case string:equal("Name",TheName) and string:equal(Type, TheType) of
                true->
                    {found,Id};
                false->
                    isRoomUniq([L],Name,Type)        
            end;
        []->
            {not_found}
    end
.

 再修改chat_room的terminate,从表中删除相应的记录:

 

terminate(_Reason,State)->
    #roominfo{id=Id}=State,
    room_manager:removeRoom(Id)
.
 

再修改房间启动时的初始化方法,房间的ID和名称从外部传入:

 

init([Para])->
    id_generator:start_link(),  
    #roominfo{id=RoomId,tablename=ClientTableName}=Para,
    client_manager:init(ClientTableName),
    case is_record(Para,roominfo)of
        true->
            {ok,#roominfo{unum=0}=Para,tablename=ClientTableName};
        Els->                        
            {ok,#roominfo{id=RoomId,unum=0,name="room"++integer_to_list(RoomId),tablename=ClientTableName,type="def"}}
    end
.
 

暂时不对代码进行测试,等后面整体修改完成后再一起测。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    erlang聊天室源码

    **Erlang聊天室源码解析** Erlang是一种面向并发的编程语言,因其在分布式系统和高可用性服务中的出色表现,常被用于构建消息队列如RabbitMQ这样的项目。本篇将深入探讨一个基于Erlang实现的简单聊天室源码,帮助...

    erlang 聊天室源码

    3. **聊天室房间管理**:可能有多个聊天室,用户可以选择加入或退出。这就需要一个房间管理模块来维护用户与房间的关系,以及管理各个房间的消息流。 4. **实时通信**:为了实现实时交互,可以使用Erlang的TCP/UDP...

    一个我自己学习Erlang的聊天室服务器及客户端代码

    2. Erlang-Java桥接库:为了方便Java与Erlang的交互,可能存在使用如Jinterface这样的库,它允许Java程序直接调用Erlang函数,或者通过Erlang的Port机制进行通信。 总结,这个项目展示了如何利用Erlang强大的并发和...

    erlang 聊天室

    构建这样的聊天室涉及到Erlang的并发特性、网络编程以及状态管理等多个方面,展示了Erlang在构建实时通信系统中的强大能力。通过学习和实践这个项目,开发者可以深入理解Erlang和OTP的设计原则,提升在分布式系统...

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    esl-erlang-26.0.2x86-64.zip

    error: /tmp/esl-erlang_26.0.2-1~alinux~3_x86_64.rpm : not an rpm package (or packape manifest): arning: /tmp/rabbitmg-erver 3.12.4-1 all.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY ...

    esl-erlang_16.b.3-2~centos~6_amd64.rpm

    esl-erlang_16.b.3-2~centos~6_amd64.rpm

    esl-erlang-24.2.1-1-centos-7-amd64.rpm

    esl-erlang_24.2.1-1_centos_7_amd64.rpm

    erlang-xmerl-23.0.2-2.el7.x86_64.rpm

    erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。

    erlang-erts-19.3.6.4-1.el7.x86_64.rpm

    erlang-erts-19.3.6.4-1.el7.x86_64.rpm

    erlang-solutions-1.0-1.noarch.rpm

    erlang-solutions-1.0-1.noarch.rpm erlang-solutions-1.0-1.noarch.rpm

    最新版erlang-23.3.4.3-1.el7.x86_64.rpm(CentOS7)

    - 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

    erlang-rpm-21.3.4.zip

    "erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的压缩文件,适用于Linux操作系统,尤其是基于RPM包管理系统的发行版,如CentOS、Fedora和RHEL等。 Erlang的主要特点包括: ...

    Erlang程序设计(第2版)1

    【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...

    erlang-19.3.6.4-1.el6.x86_64.rpm

    erlang-19.3.6.4-1.el

    erlang-java聊天

    本项目“erlang-java聊天”是一个初级水平的示例,展示了如何利用这两种语言进行交互,实现一个简单的聊天应用程序。这个聊天程序可能包括客户端和服务器端的组件,允许用户通过Erlang或Java环境进行实时通信。 **...

    erlang -c语言程序接口.pdf

    ### Erlang与C语言程序接口详解 #### 一、引言 在软件开发领域,不同编程语言之间的交互是一项重要的技术。Erlang作为一种专为构建高并发、容错性强的应用程序而设计的语言,在与其他语言(如C语言)的集成方面具有...

    erlang-crypto-19.3.6.4-1.el7.x86_64.rpm

    erlang-crypto-19.3.6.4-1.el7.x86_64.rpm

    erlang-xmerl-22.3-1.el7.x86_64.rpm 镜像下载

    erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。

Global site tag (gtag.js) - Google Analytics