Elixir服务器接收客户端消息02

session和avatar之间的消息传递

  • session使用gen_server向avatar传递消息,如:GenServer.cast(pid, {{module, func}, args})
    -pid为该进程的进程id,module为模块名,func为函数名,args为参数(list)
    avatar里面handle_cast/2匹配收到cast消息,比如:
    handle_cast({:login, _}, {id, session, data}) 登录,不需要调用其他功能模块直接返回{:noreply, {id, session, data}} (session为进程id)

    调用功能模块的匹配:
    handle_cast({{module, func}, args}, {id, data} = state)
    通过dispatch/3处理args参数,然后apply/3调用模块函数 处理数据,处理好的数据从handle_result返回消息

session:

GenServer.cast(avatar_pid, {request, msg})

avatar:

  def handle_cast({{module, action}, args}, {id, _, data} = state) do
    dispatch(module, action, List.wrap(args) ++ [{id, data}]) 
    |> handle_result(state)  #state为新的OTP状态
  end

返回的消息类型

  • {:reply, response}:发消息给客户端,服务器不做其余处理
  • {:notify, events}:发消息给客户端,服务器不做其余处理
  • {:notify, events, changed}:调用apply_rules({events, changed}, state)函数处理events和changed,返回新的events和changed,将events发给客户端,changed merge到玩家数据,返回新的OTP状态
  • {:resolve, context, effects} 在effect中处理数据,effect返回{events, changed},发送消息给客户端,返回新的OTP状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值