zoukankan      html  css  js  c++  java
  • 断线重连总结

    0.gateserver负责所有与客户端的直接连接

    m_conns[10000]也就是一个gateserver最多可以维持10000条socket连接,蓝月采用的是tcp
    行走各种消息都是tcp,不存在丢包一说,只会延迟

    每个客户端点击登录时会做以下事情
    建立socket tcp连接,向gateserver 的ip port发送请求,
    gateserver收到后,建立连接,这时候客户端与gateserver之间socket连接成功.
    gateserver将这个conn(gateserver与这个客户端的连接)加入m_conns中。

    1 gateserver与gameserver之间的通信

    用户登录成功,获取角色等过程暂时忽略,直接进入后面游戏协议
    客户端发送cm_game_pro 给gateserver,gateserver转发给gameserver
    这里每个user都有一个gameconn,这个连接表示此玩家gateserver与gameserver之间用的哪个连接

    2 gameserver的处理
    收到消息放到一个消息队列,单独线程轮训此消息队列,处理
    发过来的消息都会有index,这个字段表示的是,此玩家客户端对应的gateserver哪个连接,
    第一次时候gameserver此时还没有此玩家的记录
    gameserver维护一个m_users[10000]
    对每一个新来的连接index,分配对应的m_users[index]

    3 select,epoll,socket
    int ret = select(0, rfds, wfds, NULL, &m_timeout);
    这句话的意思就是,系统监听多个socket连接,发现那个有变化就会知道,具体暂时略过
    总之ret>0说明有了变化

    //大于0说明有消息可发
    //等于0说明异常,连接断开了

    之前的处理是,当异常,直接remove(pConn),然后处理一系列后续操作,玩家离线,登出等处理

    4 断线重连

    以上流程已经搞清楚了 断线重连也不难
    两种:断开连接重新登录,断开连接不需重新登陆

    当select/epoll send recv结果为0,本来连接直接断开的,现在保留60s
    因为手机环境下,打电话,移动网络等很大概率很频繁会出现断网,也就是socket完全断开的情况
    因此,断开不能理解就把整个connection remove掉,remove掉就是跟页游端玩家退出游戏一样,
    类似妖妖平台的DOTA,断开连接 会尝试连接,1分钟连不上那么就判断完全断开,结束游戏

    引用

    断线重连总结



  • 相关阅读:
    Qt编写控件属性设计器12-用户属性
    C#中通过三边长判断三角形类型(三角形测试用例)
    C#中通过Selenium定位<a>标签的问题
    SharePoint自动化系列——Manage "Site Subscriptions" using PowerShell
    SharePoint API测试系列——Records.BypassLocks测试
    SharePoint API测试系列——对Recorded Item做OM操作(委托的妙用)
    放松时刻——C#分割字符串
    链表——PowerShell版
    栈——PowerShell版
    队列——PowerShell版
  • 原文地址:https://www.cnblogs.com/losophy/p/10584643.html
Copyright © 2011-2022 走看看