聊天室muc服务(multi user chat)

启动聊天室服务

ejabberd所有模块都是插件形式存在,通过mnesia中的route路由到指定的模块服务,对应host配置有不同的模块服务,

ejabberd启动时调用ejabberd_app:start_modues(),会根据配置文件中host配置参数启动对应的模块服务

此时会启动muc服务,在ejabberd.cfg或ejabberd.yml配置有以下选项


ejabberd.cfg

其中,host选项,最好不要写死成为"conference.xxx.com"等形式,如果多域名的时候,会在启动每个host对应的muc服务时,

依次启动一遍,造成重复无效的启动,并且在mod_muc:init()的时候,对应的server_host可能是host_config中的任意一个,没有了对应关系

正常情况下,"conference.@HOST@"会在启动时通过正则表达式替换HOST为对应的host

mod_muc:init()

mod_muc

ejabberd启动的时候会通过gen_mod模块启动所有的mod服务模块,muc就是其中注册的一个模块

所有的服务模块都要满足gen_mod行为模式,满足start和init的启动要求格式

初始化是会注册路由ejabberd_router:register_route(MyHost),

ejabberd_router发送消息时,回去查找jid对应的route,muc进程会handle_info1到对应的room中接收消息,可以自定义处理消息

presence消息中的to用来指定房间名和发送用户的昵称


当房间路由不存在时,尝试restore重建房间,如果房间确实不存在,会start_new房间

注册成功后会register_room和id对应的信息,下次对该房间信息皆发送到该pid

所有消息都会通过room中的route方法,转接到room自定义模块中,用来broadcast消息,实现业务

mod_muc_room

1. 可以添加shaper限流功能等

2. 每个房间是一个单独的服务

3. 可以支持presence,message等协议的实现,一般iq消息不用实现

4. ejabberd实现了太多的功能,不一定用得到,也不一定合适使用

5. ejabberd的一些功能是可以借鉴使用的,借鉴实现的方式,像shaper等

你可能感兴趣的:(聊天室muc服务(multi user chat))