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

2017-08-13 17:35:04 +08:00
 fyxtc

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

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

6068 次点击
所在节点    程序员
46 条回复
winglight2016
2017-08-13 21:17:36 +08:00
@fyxtc 我可以理解,以前有个老板自称像素级肉眼,可以找到一个像素的 bug,我给他做了四个月 APP,主功能一个月完成,然后三个月都是在不停的修改 UI、bug、功能,每周都提一堆修改内容,然后说改完这些就验收,后来我直接放弃尾款了,实在做不完啊
RLib
2017-08-13 23:39:02 +08:00
@fyxtc 不是 debug 模式, 一些重要的 log 该记录还是得记录啊, 不然出问题不是没事找事嘛, 对性能影响几乎为 0
jedihy
2017-08-14 04:42:35 +08:00
看不懂你说的问题
pengdu
2017-08-14 09:25:58 +08:00
protobuf 慢的话,用 flatbuffer 啊。都是 G 家的,后一个快。
pengdu
2017-08-14 09:39:16 +08:00
楼主我这样理解对吗?客户端的逻辑:
1,没有建立到服务器的连接,进入 2
2,建立到服务器的连接,如果成功,进入 3,失败的话等待 3s,进入 2
3,客户端每隔 3s 给服务端发心跳,如果连续 3 次心跳失败,进入 4
4,客户端关闭连接,进入 2

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

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

2. 发出去了没回
大概率就是服务器端口不可达
leyucode
2017-08-14 14:19:03 +08:00
游戏发出来吧,让我们帮忙测试,哈哈
changnet
2017-08-14 15:46:58 +08:00
什么类型的游戏呢? pb 的解析是比自定义的二进制慢,但一般都能满足使用要求的
enenaaa
2017-08-14 15:51:25 +08:00
@zengzizhao +1, 要是上线后留存、付费不好。各种瞎分析,无头苍蝇的优化会更折磨。
fyxtc
2017-08-14 16:16:15 +08:00
@hellboys 嗯,好的 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382631

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX