一、【心跳包】
减少服务器资源占用
二、长链接中的心跳包是什么
保活:keep alive
> 定时向服务端发送信息
> 能够响应服务端信息
三、复现缺少心跳包的BUG
长链接业务场景:
》游戏
》即时通讯
即时通讯:虚拟机模拟服务器,可以暂停运行的代码,Xshell当客户端访问服务器(telnet 192.168.56.103 9001),进入聊天室。
此时暂停服务器,模拟服务器掉线,客户端ping不同,在没有心跳机制的情况下,服务端掉线,对方不可知,客户端不能发消息,网络不可知。
设想:如果客户端掉线,服务端不知道,此时还维持链接,就是额外无效系统开销
为什么需要心跳包?
》在NAT、防火墙网络中转设备,保持信道记录
》及时发现对方网络断开,以便及时采取措施
四、如何实现心跳包
》TCP层面心跳包,只能够验证网络连接是否异常(用户层无感知)
例子:一个接口网线、CPU、电线、网卡都正常,但是此时这个接口已经死循环,无法处理请求,此种情况检查不出来
》应用层面的心跳包,验证服务接口是否异常(判断接口逻辑、功能、能力是否正常),工作当中用这个
问:为什么不同时采用两种,而是放弃第一种:
答:因为第二种包含了第一种,能传输信息已经证明接口网络正常
1. 能发送socket心跳包
》postman:不能
》jmeter:依赖插件
》python:所有
2.编写socket测试用例
》创建文件
》导入socket模块
》编写代码
import socket
import time
from threading import Thread # 参考java中的线程
server_adders = "127.0.0.1", 9001
client = socket.create_connection(server_adders)
print("连接成功")
'''
实现心跳包发送代码
1.需要不断地发送
2.能够及时停止
'''
def ping():
"发送心跳包"
while True:
time.sleep(4) # 5秒之内
client.sendall(b"_PING") # _PING 心跳包内容
# 这个循环主线程,测试主流程
while True:
# ping() # 建立链接之后就发
Thread(target=ping).start() # 启动新线程,执行发送心跳包的代码
# 此处ping没有返回值,不能加(),所以为ping
# ping 一个函数
# ping() 一个函数的返回值
msg = client.recv(1024 * 4)
# client.sendall("心跳包数据\r\n".encode())
# time.sleep(1) // 不能这样一直发
if not msg:
print("服务端断开连接")
break
print("msg: ", msg)
if b"Please set your nickname" in msg:
client.sendall(b"BeiFan\r\n")
print("需要给服务器发送信息", b"BeiFan")
实现心跳包发送机制:每4秒发送一个心跳包
基本原则:和测试用例、已经业务流程,互不干涉
并发编程:
》多线程 ——>最简单
》多进程
》协程 ——>最牛皮
PING\PONG:乒乓球(来回来回,表示心跳)
在websocket协议中,作为心跳协议名
问:TCP和UDP的区别是什么?
答:TCP是可靠的网络传输,没有收到心跳包,断言 网络中断
问:HTTP接口和websocket接口有什么区别?
答:http接口是基于http协议的
websocket接口是基于websocket协议,过程如下:
1.HTTP 返回101 (先HTTP握手)
2.TCP 》》》长链接 (后面转成TCP)