iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
904 stars 201 forks source link

请教关于心跳超时的疑惑 #252

Closed ammonzhang closed 7 months ago

ammonzhang commented 7 months ago

iogame 21 版本 按照教学例子 启用了 心跳机制,设置了 客户端每1秒 向 iogame 对外服 发送 cmdCode:0 的心跳包, 对外服的 idleProcessSetting .setIdleTime 设置为3秒。刚启动后,心跳可以正常使用,如果停止客户端的发送心跳包,则 3秒后,正常关闭连接。但如果持续发送心跳包大约1分钟左右,有时三分钟,时间不定,callback回调方法里 就会出现各种读写超时,关闭连接。换各种网络依然如此调试还发现,如果我发送了一个cmdcode:1的 业务逻辑数据,则这个1分钟左右的关闭链接 时间 就会延长关闭时间。如果多开几个前端页面的客户端发送心跳包,则超时情况会更快的出现,感觉占用通道堵塞一样。这个是和什么有关系呢?

iohao commented 7 months ago

没发现问题,可以尝试运行一下相关 demo。

https://github.com/iohao/ioGame-example/tree/eff039a7ab76c1005c294148a11b2cca94728fa3/example/example-hook/src/main/java/com/iohao/game/example/hook

https://github.com/iohao/ioGame-example/blob/eff039a7ab76c1005c294148a11b2cca94728fa3/example/example-hook/src/main/java/com/iohao/game/example/hook/DemoHookClient.java#L47-L52

 // 启动模拟客户端 
 new ClientRunOne() 
         .setInputCommandRegions(inputCommandRegions) 
         // 开启心跳,每 3 秒向服务器发送一次心跳消息 
         .idle(3) 
         .startup(); 
ammonzhang commented 7 months ago

OK,找到问题了。是前端页面周期发送的问题,setInterval的周期精度坑问题,一定时间会内存泄漏,长时间不发送。谢谢