这两天又遇到一个问题,就是当用户在登录服务器验证通过,和大厅服务器(Hall server)连接后,展示那个目录树房间人数后,是马上断开还是一直保持连接?我目前做的是保持长连接,我分析了两种连接的利弊:
1.和大厅一直保持长连接,优点:每次去展开节点时就不需要再去和大厅服务器试图连接,缺点:和大厅服务器保持一个长连接,这个连接的使用频率其实是非常低的,并且这样会导致每个客户端至少要保持两个和服务器的连接(一个和大厅,一个和游戏逻辑服务器)
2.和大厅一直保持长连接,只有当用户每次去展开节点时去连接,取得房间人数,优缺点反之。

解决方案 »

  1.   

    那么当客户端突然断电。死机了怎么通知服务端该用户已经下线?
      

  2.   

    判断用户是否是在线状态,一般由登录验证服务器来做,和大厅服务器没有太大关系。
    先要把流程弄清楚。
    1.客户端先判断是否是登录状态,如果不是,就去登录验证服务器上去登录验证;
      如果是登录状态,就去查看令牌是否到期,如果到期了,就去验证服务器上获取新的令牌。
    2.客户端到登录验证服务器上做身份验证的时候,如果验证通过(登录成功),登录验证服务器会发给客户端一个具有时效限制的令牌。
    3.当客户端持有有效的令牌时,就可以去大厅服务器上面获取数据。
      一般,令牌内容会牵扯到生成时间、有效时长、以及权限或角色等等的信息,通过一定的加密方式后,互相传递。
    4.除了登录验证服务器以外的其他服务器,只对令牌做验证(注意,令牌不是针对某个用户做验证,而是针对时效和权限、角色等做验证)。
      只有持有有效令牌的客户端,才可以访问服务器。如果令牌的加密方式、时效、或者权限角色有一个不正确,就不让其访问服务器的数据。
    5.登录验证服务器,判断客户端状态的方法,有很多。(前面已经讨论过用长连接还是短连接了)
      长连接可以通过连接是否断开来判断;短连接可以通过超时(和长连接的维持连接包类似的“心跳同步”技术)来判断。