第25讲 | 如何判断心跳包是否离线?
蔡能
该思维导图由 AI 生成,仅供参考
在初学网络,编写过阻塞和非阻塞网络代码的时候,有一个问题,那就是在非阻塞的情况下,不知道对方的网络何时断开。
因为在非阻塞的情况下,如果没有接收到消息,recv 的数值一直会是 0。如果以这个来判断,显然是错误的。而在阻塞情况下,只要对方一断开,接收到 0 就说明断开了,那么我们怎么才能在非阻塞的情况下确定连接是断开还是没断开呢?
我们可以采用离线超时的方案来判断对方连接是否断开。那什么是离线超时呢?
我们都知道,人累了就要休息。你在休息的时候,有没有注意过这么一个现象,那就是你在快要睡着的时候,忽然脚会蹬一下,或者人会抽一下,这是为什么呢?
有一种说法流传很广,说,其实大脑是在不停地检测人有没有“死”,所以发送神经信号给手和腿。抽动一下,检验其是否死亡。这个就有点儿像我们检测超时,看看有没有反应。
现在我们先看一段 Python 代码,让它运行起来。
这是我节选的一部分代码。其中,在函数 server_run 里面,我们先定义了一个 clients,这是一个列表,用于后面保存客户端连接用。my_server 获得 socket 句柄,并且将之设置为 TCP 模式,随后我们绑定地址为本地(bind 函数),端口号为 1024,并且开始侦听,随后我们看到 setblocking 函数,将之设置为非阻塞模式。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
在非阻塞网络编程中,如何判断对方的网络何时断开是一个关键问题。本文通过介绍离线超时、心跳包和TCP协议中的SO_KEEPALIVE选项等方法,深入探讨了解决这一问题的方案。作者通过具体的Python代码示例演示了非阻塞网络编程的实现过程,并指出了在TCP握手中服务器端无法及时得知客户端断开连接的问题。此外,文章还提出了两种心跳策略,并讨论了它们在不同情况下的适用性。总的来说,本文通过技术原理和代码示例,深入浅出地介绍了非阻塞网络编程中的断开连接判断问题及解决方案,对于初学网络编程的读者具有一定的参考价值。读者可以通过本文了解到在非阻塞网络编程中如何应对网络断开的情况,以及如何利用心跳包和超时计算等方式来处理断开操作。同时,文章还提出了两种心跳策略,为读者提供了在实际应用中的选择思路。最后,文章留下了一个思考题,引发读者对于阻塞方式服务器代码中心跳包存在意义的思考,为读者提供了进一步思考和讨论的空间。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学游戏开发》,新⼈⾸单¥59
《从 0 开始学游戏开发》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(1)
- 最新
- 精选
- 放羊大王应该也要心跳包吧,心跳是判断存活,跟阻塞没关系吧,上面的代码其实就是同步的,具体阻塞与非阻塞应该就是是否等待消息。假如是单独的心跳服务器,就类似于网关,那么必须有一个rpc通道到后端,一个rpc通道连接会不会吃紧,还有就是一台2H4G的服务器,负载2D坦克大战这种只传坐标的游戏可以负载多少用户呢,好像单机有socket 连接限制,第一个遇到的就是文件打开太多。2018-08-092
收起评论