从 0 开始学游戏开发
蔡能
原网易游戏引擎架构师,资深游戏底层技术专家
37243 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
从 0 开始学游戏开发
15
15
1.0x
00:00/00:00
登录|注册

第25讲 | 如何判断心跳包是否离线?

阻塞方式的服务器代码下心跳包的意义
不同CPU负载情况下的心跳策略选择
心跳包作为服务器间交互方法
使用心跳包和超时判断网络断开
CPU负载情况下的选择
实时调整心跳时间
固定心跳时间
数据存储和调试
心跳服务器功能
心跳包设计
SO_KEEPALIVE设置
判断客户端数据
accept客户端连接
server_run函数
采用心跳包检测超时
类比大脑检测“死”
无法判断对方网络是否断开
recv数值一直为0
思考题
小结
心跳模式策略
应用层心跳包
TCP协议中的心跳包
Python代码示例
离线超时方案
非阻塞网络代码问题
在非阻塞网络中判断对方网络断开

该思维导图由 AI 生成,仅供参考

在初学网络,编写过阻塞和非阻塞网络代码的时候,有一个问题,那就是在非阻塞的情况下,不知道对方的网络何时断开。
因为在非阻塞的情况下,如果没有接收到消息,recv 的数值一直会是 0。如果以这个来判断,显然是错误的。而在阻塞情况下,只要对方一断开,接收到 0 就说明断开了,那么我们怎么才能在非阻塞的情况下确定连接是断开还是没断开呢?
我们可以采用离线超时的方案来判断对方连接是否断开。那什么是离线超时呢?
我们都知道,人累了就要休息。你在休息的时候,有没有注意过这么一个现象,那就是你在快要睡着的时候,忽然脚会蹬一下,或者人会抽一下,这是为什么呢?
有一种说法流传很广,说,其实大脑是在不停地检测人有没有“死”,所以发送神经信号给手和腿。抽动一下,检验其是否死亡。这个就有点儿像我们检测超时,看看有没有反应。
现在我们先看一段 Python 代码,让它运行起来。
import socket
import time
def server_run():
clients = []
my_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
my_server.bind(("", 1024))
my_server.listen(256)
my_server.setblocking(False)
这是我节选的一部分代码。其中,在函数 server_run 里面,我们先定义了一个 clients,这是一个列表,用于后面保存客户端连接用。my_server 获得 socket 句柄,并且将之设置为 TCP 模式,随后我们绑定地址为本地(bind 函数),端口号为 1024,并且开始侦听,随后我们看到 setblocking 函数,将之设置为非阻塞模式。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在非阻塞网络编程中,如何判断对方的网络何时断开是一个关键问题。本文通过介绍离线超时、心跳包和TCP协议中的SO_KEEPALIVE选项等方法,深入探讨了解决这一问题的方案。作者通过具体的Python代码示例演示了非阻塞网络编程的实现过程,并指出了在TCP握手中服务器端无法及时得知客户端断开连接的问题。此外,文章还提出了两种心跳策略,并讨论了它们在不同情况下的适用性。总的来说,本文通过技术原理和代码示例,深入浅出地介绍了非阻塞网络编程中的断开连接判断问题及解决方案,对于初学网络编程的读者具有一定的参考价值。读者可以通过本文了解到在非阻塞网络编程中如何应对网络断开的情况,以及如何利用心跳包和超时计算等方式来处理断开操作。同时,文章还提出了两种心跳策略,为读者提供了在实际应用中的选择思路。最后,文章留下了一个思考题,引发读者对于阻塞方式服务器代码中心跳包存在意义的思考,为读者提供了进一步思考和讨论的空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学游戏开发》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 放羊大王
    应该也要心跳包吧,心跳是判断存活,跟阻塞没关系吧,上面的代码其实就是同步的,具体阻塞与非阻塞应该就是是否等待消息。假如是单独的心跳服务器,就类似于网关,那么必须有一个rpc通道到后端,一个rpc通道连接会不会吃紧,还有就是一台2H4G的服务器,负载2D坦克大战这种只传坐标的游戏可以负载多少用户呢,好像单机有socket 连接限制,第一个遇到的就是文件打开太多。
    2018-08-09
    2
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部