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

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

在初学网络,编写过阻塞和非阻塞网络代码的时候,有一个问题,那就是在非阻塞的情况下,不知道对方的网络何时断开。
因为在非阻塞的情况下,如果没有接收到消息,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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学游戏开发》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

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