你想知道我们请求一个url
的时候,握手和请求资源分别占用多长时间么?今天我们使用python
写个小案例来看看吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
项目中使用了python
装饰器,若还对python
装饰器不太了解的小伙伴,可以参考一下下面这篇文章:python | 探寻python装饰器
项目展示
打开项目,修改hosts
、port
、methods
以及url
的变量,即可运行python
程序便可获得该页面的详细信息的时间,其中包括TCP/IP
三次握手时间 以及 请求接口耗时,最后是 总的耗时,
如何获得握手时间
在获取握手时间的时候,不能使用http
库,例如: requests
,因为它默认会进行tcp/ip
三次握手,而后再进行资源请求,所以我们要使用socket
来做这个需求。
在python
中,socket
提供了一种跨平台的网络通信接口,可以用它来创建各种类型的网络连接。
例如代码如下:
1 2 3 |
|
在上面的代码中,我们先导入socket
库,而后使用socket.socket()
创建一个socket
句柄,而中间的参数分别代表的意思为:
socket.AF_INET
: 指定IPv4
协议。socket.SOCK_STREAM
: 指定使用TCP
流式套接字类型。
而s.connect
则开始连接服务器,其参数类型为元组类型,参数值为远程主机名 和 远程端口。
如上代码,当远程服务器连不上的时候或者其他异常的时候,该代码会抛异常,若没有异常,则证明端口通的。
我们仅需要在此之前和之后,都拉一下当前时间戳,就可以计算出握手所耗费的时间,例如:
1 2 3 4 5 6 7 8 9 10 |
|
若没有抛错,我们即可获得握手时间。
如何获得请求时间
握手成功后,我们就可以向该服务器发送http
报文了,注意最简单报文的格式是:
请求方法 请求路由 版本号
请求头(主机名)
空行
例如:
GET / HTTP/1.1
Host: 127.0.0.1:8080
如果我们不添加Host
请求头,则会抛错: HTTP/1.1 400 Bad Request: missing required Host header
。
在python
中,我们直接使用s.send()
函数即可发送请求,例如:
1 2 3 |
|
上述代码中,\r\n
是换行的意思,也称之为CRLF
,注意最后的2个\r\n
是有一个空行,来标志http
请求头的结束。
一般来说,我们请求接口后,会读取服务器返回来的状态码,以便开发验证是否是成功的。
这里可以使用s.recv()
函数来读取服务器传回来的信息,例如读取从服务器返回的15个字节s.recv(15)
。
我们可以参考计算握手时间的方法,来计算一下资源请求的时间,代码如下:
1 2 3 4 5 6 7 8 9 10 |
|
如果远程主机和远程端口都正常的话,我们大概会得到如下的信息:
善用装饰器
我们计算握手时间,和计算资源请求时间,都是相同的代码,因为计算的功能不同,所以我们需要被迫写2次,这个时候,就可以使用装饰器,来把这个额外非核心功能给抽离出来,而将计算握手和计算资源请求都给封装为函数,而后通过函数来调用装饰器,就可以获取2种请求时间了。
我们先将装饰器抽离出来:
1 2 3 4 5 6 7 8 |
|
我们在funcRunTimes
中直接返回wrapper
函数,而在wrapper
函数中,定义开始时间和结束时间,在二者的中间执行函数func
,最后将func
的结果以及函数执行的时间封装为一个元组进行返回。
此时,我们可以封装函数了,例如我们想获取握手的时间,我们可以这样写:
1 2 3 4 5 6 7 8 9 |
|
如果该远程主机可以连上,我们直接返回socket
句柄,若连接不上,直接打印错误,返回None
。
调用该函数的是,我们接收返回值即可:
1 |
|
注意,shakeInfo
是一个元组,有2个元组,第一个是socket
句柄,第二个是执行该函数所需要的时间。
我们再将资源请求函数封装一下,就可以完成这个项目了。
总结
我们使用python socket
连接服务器,以及发送http
报文,再计算2个函数所执行的时间,便可以获取到握手和资源请求的时间了,最后再将获取时间的函数提取出来,封装为装饰器,供函数调用,即可得到函数的执行时间了。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
qq群号:485187702【暗号:csdn11】
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】