生成UUID
Option Explicit
Private Type GUID
Data1 As Long
Data2 As Long
Data3 As Long
Data4(8) As Byte
End Type
Private Declare Function CoCreateGuid Lib "ole32.dll" (pguid As GUID) As Long
Private Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As Any, ByVal lpstrClsId As Long, ByVal cbMax As Long) As Long
Private Function MSGIDGen() As String
Dim uGUID As GUID
Dim sGUID As String
Dim bGUID() As Byte
Dim lLen As Long
Dim RetVal As Long
lLen = 40
bGUID = String(lLen, 0)
CoCreateGuid uGUID '把结构转换为一个可显示的字符串
RetVal = StringFromGUID2(uGUID, VarPtr(bGUID(0)), lLen)
sGUID = bGUID
If (Asc(Mid$(sGUID, RetVal, 1)) = 0) Then RetVal = RetVal - 1
GUIDGen = Left$(sGUID, RetVal)
msgId = Replace(GUIDGen, "-", "") '替换,消除UUID中的"-"字符
msgId = Replace(msgId, "{", "")
msgId = Replace(msgId, "}", "")
'Debug.Print msgId
End Function
获取时间戳
timeStamp = Format(Date, "yyyy-m-d ") & Format(Time, "hh:mm:ss")
‘2019-07-31 15:39:00
Transfer-Encoding
一、Transfer-Encoding: chunked是什么?
Transfer-Encoding头字段可以用在请求头或响应头中。该头字段有两个值chunked和identity
作用:
Transfer-Encoding值为chunked时,代表要把请求的数据或响应的数据切割成一系列的块数据传输。
Transfer-Encoding值为identity时,代表不做任何处理。
二、为什么分块?
分块传输的目的是为了实现长连接, 有了长连接后就可以实现连接池。长连接和连接池的作用是可以提高http请求的性能。
三、http长连接如何实现?
1.什么是短连接? 连接->传输数据->关闭连接
2.什么是长连接? 连接->传输数据->保持连接 -> 传输数据-> ... ->关闭连接。
3.长连接为什么可以提性能?
HTTP运行在TCP连接之上,自然也有着跟TCP一样的三次握手、四次挥手、慢启动等特性。使用长连接可以减少三次握手、还可以避免遇上TCP慢启动的拥塞适应阶段等时间,自然可以提高性能。
4.如何设置http短连为长连? Connection: keep-alive (头部字段)
5.配置完keep-alive后,http连接如何来确定请求或响应的实体边界,即我们怎么知道某一次的请求内容或响应内容已发送完成?
两个方案:
(1)判断传输数据是否达到了Content-Length指示的大小。具体方法:计算实体长度,并通过头部告诉对方。
(2)设置Transfer-Encoding:chunked,进行分块传输:
方案1的问题在于某些情况下实体长度并没那么好获得(如网络响应大文件,获取长度比较耗时,客户端需要等待较长时间),于是有了方案2.
报文格式要求如下:
每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。
网友评论