V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
fyxtc
V2EX  ›  程序员

手游,周末上线前夕,丢过来一坨不痛不痒触发概率极低但是贼难改的 socket 的 bug,我也很绝望啊

  •  
  •   fyxtc · 2017-08-13 17:35:04 +08:00 · 6101 次点击
    这是一个创建于 2688 天前的主题,其中的信息可能已经有所发展或是发生改变。

    真的是好气啊,而且存在热更的情况下,迟迟不上线,非得各种极限情况都要测一遍,说好听点是追求完美,说不好听点就真的是吹毛求疵了。是每个项目经理每个测试一定非得测到无 bug 再上线?我有一句 mmp 也是真的想讲....,此贴纯属吐槽,真的很来气

    ps:最新丢的一个问题是,问啥后台挂了一个晚上之后(进后台都会 close ),早上起来 socket connect 就失败了。我现在 ios 正在后台挂机。。刚到一个小时。。。一小时可以成功就测两小时。。直到测到不成功,然后看日志,虽然我估计可能也看不出来啥的。。。自己已有的知识也很难解释,为什么 close 之后的 connect 就会失败了呢(服务器正常运行中),用的 luasocket。心塞塞的。。。。

    第 1 条附言  ·  2017-08-13 19:08:31 +08:00
    又丢一个建设性问题让我解决:protobuf 解析很慢。。。。。同志们,为了游戏能赚点钱,真的很心酸啊
    第 2 条附言  ·  2017-08-13 19:20:35 +08:00
    一小时测了回来能正常连上。。。。
    第 3 条附言  ·  2017-08-14 11:53:34 +08:00
    谢谢大家的帮忙,这个一晚重连的问题了 probuf 的问题都准备放在下个版本解决了。。。昨天结果还是没上去,今天上。。。
    46 条回复    2017-08-14 20:53:40 +08:00
    Wicked
        1
    Wicked  
       2017-08-13 17:55:49 +08:00   ❤️ 1
    后台挂一晚上...你跟产品经理说,就算是王者荣耀,后台挂一晚上,也是要强制你杀进程重启的
    lcdtyph
        2
    lcdtyph  
       2017-08-13 18:02:17 +08:00 via iPhone
    客户端的 socket 是不是绑定了本地端口啊
    leyucode
        3
    leyucode  
       2017-08-13 18:07:41 +08:00 via Android
    是啥游戏,发出来玩玩呗
    misaka19000
        4
    misaka19000  
       2017-08-13 18:09:42 +08:00
    后台挂一段时间不应该强制客户端下线吗
    RLib
        5
    RLib  
       2017-08-13 18:13:30 +08:00
    失败总有错误码吧, 错误码是多少
    fyxtc
        6
    fyxtc  
    OP
       2017-08-13 19:03:35 +08:00
    @lcdtyph 是这样的每次 connect 成功的时候,会本地记录最新成功那一次的 ip/port,然后重连的时候会直接调用最新记录的,我怀疑的可能服务器的 ip 或者 port 晚上发生了变化,但是服务器说没有。。。唉
    fyxtc
        7
    fyxtc  
    OP
       2017-08-13 19:04:23 +08:00
    @Wicked 我是真的想和他说,你先试试其他游戏一晚上能回来的好不。。。(没敢说,这个需求是老板提的
    fyxtc
        8
    fyxtc  
    OP
       2017-08-13 19:05:40 +08:00
    @RLib 不是我测的。。。不是 debug 模式。。。难道我只能挂着一晚,明早再过来看日志了吗。。我真的很无奈
    fyxtc
        9
    fyxtc  
    OP
       2017-08-13 19:06:39 +08:00
    @misaka19000 我们游戏老板意思是“如果挂一晚上回来没重连上,那重连还有什么用” 原话。。。你经历过绝望吗 😂
    fyxtc
        10
    fyxtc  
    OP
       2017-08-13 19:07:13 +08:00
    @leyucode 还没上线呢,估计今晚要通宵都说不定。。。
    nVic
        11
    nVic  
       2017-08-13 19:07:42 +08:00 via iPhone
    告诉老板,PM 能碰到源码,可能正在把源码泄漏给竞争对手。
    Athrob
        12
    Athrob  
       2017-08-13 19:08:57 +08:00
    @Wicked #1 然而并不是啊, 我第二天打开后只是掉线而已, 然后就重连进去了.
    KnightMobile
        13
    KnightMobile  
       2017-08-13 19:13:00 +08:00
    connect 失败看信息,不看经验
    chinvo
        14
    chinvo  
       2017-08-13 19:23:49 +08:00
    @fyxtc #9 重连不是这么用的吧,这游戏莫非是后台挂机专用
    fyxtc
        15
    fyxtc  
    OP
       2017-08-13 19:47:43 +08:00
    @chinvo 重连就是这样用的吧。。。后台就 close 了呀
    leyucode
        16
    leyucode  
       2017-08-13 19:57:23 +08:00 via Android
    @fyxtc 上线了说一下啊,我好去第一批测试,哈哈
    tvallday
        17
    tvallday  
       2017-08-13 20:14:42 +08:00
    protobuf 解析的确慢。编码我都用超轻量级的或者自己写。
    ini
        18
    ini  
       2017-08-13 20:54:48 +08:00 via iPhone
    游戏的断线重连,是给游戏中因为地铁信号不稳定等原因短暂掉线又快速能连上的场景用的,主要针对有连续战斗,手机放一晚上还要求断线重连,只能说你们老板不懂游戏
    fyxtc
        19
    fyxtc  
    OP
       2017-08-13 21:10:04 +08:00
    @tvallday 准备尝试一下改成单层结构,现在是嵌套了三层 message,然后有两层用了 repeated,都是 Int 的数值,打算改成就用一个字符串传过来,然后自己解析,应该能快不少
    fyxtc
        20
    fyxtc  
    OP
       2017-08-13 21:12:28 +08:00
    @ini 老板人是很厉害的,一些判断也很独到。。。但是就是有的时候太扣细节了,不断修改,而且特喜欢测极限的复杂情况,很无奈。。。
    winglight2016
        21
    winglight2016  
       2017-08-13 21:17:36 +08:00
    @fyxtc 我可以理解,以前有个老板自称像素级肉眼,可以找到一个像素的 bug,我给他做了四个月 APP,主功能一个月完成,然后三个月都是在不停的修改 UI、bug、功能,每周都提一堆修改内容,然后说改完这些就验收,后来我直接放弃尾款了,实在做不完啊
    RLib
        22
    RLib  
       2017-08-13 23:39:02 +08:00
    @fyxtc 不是 debug 模式, 一些重要的 log 该记录还是得记录啊, 不然出问题不是没事找事嘛, 对性能影响几乎为 0
    jedihy
        23
    jedihy  
       2017-08-14 04:42:35 +08:00
    看不懂你说的问题
    pengdu
        24
    pengdu  
       2017-08-14 09:25:58 +08:00
    protobuf 慢的话,用 flatbuffer 啊。都是 G 家的,后一个快。
    pengdu
        25
    pengdu  
       2017-08-14 09:39:16 +08:00
    楼主我这样理解对吗?客户端的逻辑:
    1,没有建立到服务器的连接,进入 2
    2,建立到服务器的连接,如果成功,进入 3,失败的话等待 3s,进入 2
    3,客户端每隔 3s 给服务端发心跳,如果连续 3 次心跳失败,进入 4
    4,客户端关闭连接,进入 2

    不知道是否可以解决你的问题,服务端应该是不用改的吧。
    koalli
        26
    koalli  
       2017-08-14 09:49:07 +08:00
    我记得好像 cocos2dx 的 libwebsocket 也很多人反映说在 iOS 下会断线,会无法收到断线状态的消息什么的,他们的解决方案是 iOS 换成了 facebook 的 SocketRocket
    hellboys
        27
    hellboys  
       2017-08-14 10:38:07 +08:00
    为什么 close 之后的 connect 就会失败了呢....


    ```
    iOS 后台长时间肯定会被 close.

    服务器 ip 和 listen 端口会跟客户端 ip 和端口进行建立连接和数据流交互.
    新建立的 connect 本地端口发生变化(五元组), 顾服务器认为是新的连接.

    1.即使 bind 相同的本地端口. 从还是存在 External IP 变化(运营商,wifi 出口等).
    2.即使五元组相同, tcp 协议也有不同方案的保活. 也不会和不复存在客户端 ip 和端口周旋一个晚上.
    ```

    问题的重点是:
    1.新建立的连接, 是否成功(三次捂手)?
    2.新建立的连接是成功, 只是和服务区端协商的私有状态同步有问题(业务数据)?
    jukka
        28
    jukka  
       2017-08-14 10:48:16 +08:00 via iPhone
    失败了会给你错误代码吧,发上来。
    结构上你需要一个状态极,从后台切回来之后直接切到登陆的那个状态机,逻辑全走一遍不就完了。
    hector
        29
    hector  
       2017-08-14 10:56:24 +08:00
    失败了重试就好了,你怎么指望连一次就成功
    fyxtc
        30
    fyxtc  
    OP
       2017-08-14 11:42:54 +08:00
    @hellboys 是连接就没有成功,直接调用 connect 方法就失败了,因为当时是老板测的,没办法获取 error code,现在现在在失败的时候弹窗的时候直接弹出 error code 看下次老板测的时候是什么了。我其实不太理解,就像你刚刚说的,这边测的时候是保证 ip/port 和网络 还有服务器总是正确且不变的情况下,为什么就不能连上呢,这和关了游戏重进这种 connect 有什么区别吗
    fyxtc
        31
    fyxtc  
    OP
       2017-08-14 11:49:05 +08:00
    @pengdu 我可能没有表述清楚,是这样的,心跳现在本来就有的,每 1s 一发,3s 收不到判断断开。但是程序在进后台的时候会主动调用 close 方法,相当于很干净的状态了,然后调用 connect 这和正常第一次调用的 connect 有什么区别吗( ip/port 和服务器都是正确且不变的情况)。。我猜想认为系统做了啥操作阻止了这个 app 的连接请求。你说的如果在没有连接成功的情况 3s 重试是一个解决方案,不过我估计老板也不认。。。他应该是想一次就成功。就像我之前测的一般情况,几小时后台回来的话都是很顺利直接连上的
    fyxtc
        32
    fyxtc  
    OP
       2017-08-14 11:51:48 +08:00
    @RLib 这个。。。确实可以记录在 Bugly 上,这个问题留在之后解决了,应该今天能上。。。昨天搞到了一点。。。今天服务器才批下来能部署
    fyxtc
        33
    fyxtc  
    OP
       2017-08-14 11:54:53 +08:00
    @koalli 嗯,谢谢提供一个可选的方案,记下了
    fyxtc
        34
    fyxtc  
    OP
       2017-08-14 11:57:51 +08:00
    @winglight2016 嗯,确实,碰到这种极度追求细节的产品经理确实很挑战程序员的心态,他们可怕的地方是他们以为是修改,但是对我们来说其实是新的需求。。。但是我这是老板没办法,只能撑着头皮抗下去。。还好已经计划放在下个版本了,先松一口气,再不上线,团队都得压抑得不行了。。
    zengzizhao
        35
    zengzizhao  
       2017-08-14 12:36:50 +08:00   ❤️ 1
    当然上线了能赚钱还好,不然你们估计没体验过,上线了更压抑,游戏赔钱的时候还得继续改莫名的 bug 的感觉更差
    hellboys
        36
    hellboys  
       2017-08-14 14:12:53 +08:00
    @fyxtc 重新调用 connect 应该就是全新的. 看看 errno.

    抓包看看三次捂手具体情况.
    1. 没发出出去
    客户端问题

    2. 发出去了没回
    大概率就是服务器端口不可达
    leyucode
        37
    leyucode  
       2017-08-14 14:19:03 +08:00 via iPhone
    游戏发出来吧,让我们帮忙测试,哈哈
    changnet
        38
    changnet  
       2017-08-14 15:46:58 +08:00 via iPad
    什么类型的游戏呢? pb 的解析是比自定义的二进制慢,但一般都能满足使用要求的
    enenaaa
        39
    enenaaa  
       2017-08-14 15:51:25 +08:00
    @zengzizhao +1, 要是上线后留存、付费不好。各种瞎分析,无头苍蝇的优化会更折磨。
    fyxtc
        40
    fyxtc  
    OP
       2017-08-14 16:16:15 +08:00
    @hellboys 嗯,好的 谢谢
    fyxtc
        41
    fyxtc  
    OP
       2017-08-14 16:17:32 +08:00
    @leyucode
    @zengzizhao
    是啊,现在手游也是下坡趋势。。。没上线谁都不知道结果,希望能赚钱吧
    DogKings
        42
    DogKings  
       2017-08-14 16:20:02 +08:00
    6666666
    sampeng
        43
    sampeng  
       2017-08-14 16:59:08 +08:00
    所有奇葩问题都甩给苹果,反正产品经理也不懂。。讲真。有些问题没有解的意义。
    sampeng
        44
    sampeng  
       2017-08-14 17:01:37 +08:00
    ps 一句。。挂后台一晚上不断,先不说你这游戏耗电量肯定留存有影响。你服务器吃的消?大部分人都没有关应用的习惯。10 万个长连接你服务器还不跪?
    imherer
        45
    imherer  
       2017-08-14 18:15:40 +08:00
    楼主是客户端还是服务端? 你们服务端用的什么语言开发的?
    fyxtc
        46
    fyxtc  
    OP
       2017-08-14 20:53:40 +08:00   ❤️ 1
    @imherer 我是客户端,cocos,服务器用的 java
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5447 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:05 · PVG 15:05 · LAX 23:05 · JFK 02:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.