.版本 2
.支持库 sock
.程序集 Hp_PackTCP, , 公开
.程序集变量 m_client, 网络客户端, , , 这个网络客户端不知道有没有什么问题,看着用, 不行换 socket() 来创建客户端
.程序集变量 m_buffer, 字节集, , , 如果追求高大上, 就换内存池
.程序集变量 m_requiredLen, 整数型, , , 拆包用的
.程序集变量 m_buffLen, 整数型, , , 拆包用的
.程序集变量 m_isHeader, 逻辑型, , , 拆包用的
.程序集变量 m_flag, 整数型, , , 包标记
.程序集变量 m_maxLen, 整数型, , , 单次send最大长度
.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用
Reset ()
.子程序 Reset
m_client.断开 ()
m_buffer = { }
m_requiredLen = 4
m_isHeader = 真
m_buffLen = 0
m_flag = 0
m_maxLen = 4095 × 1024
.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用
Reset ()
.子程序 DisConnect, , 公开
Reset ()
.子程序 Recv, 字节集, 公开, 返回{ }的话, 可能是超时, 也可能是异常断开了
.参数 timeout, 整数型, , 0 无限等待.
.局部变量 bResult, 逻辑型
.局部变量 dataAll, 字节集
.局部变量 dataTemp, 字节集
.局部变量 ret, 字节集
ret = { }
.判断循环首 (真)
' 够了 , 第一次肯定是不成立的, 会直接走到下面的 接受
.判断循环首 (m_buffLen ≥ m_requiredLen)
m_buffLen = m_buffLen - m_requiredLen
.判断开始 (m_isHeader)
' 是包头
' 减去包头长度.
' 从包头获取包体长度
m_requiredLen = GetPacketLen (m_buffer)
' buff里最前面的包头清掉,只保留后面的, 下一次再来数据, 就是包体了 , 包头长度4
m_buffer = 取字节集右边 (m_buffer, 取字节集长度 (m_buffer) - 4)
' 下一次期待包体
m_isHeader = 假
.判断开始 (m_requiredLen > m_maxLen)
' 数据长度太大, GG
ret = { }
m_client.断开 ()
跳出循环 ()
.默认
.判断结束
.默认
' 包体数据够了
ret = 取字节集左边 (m_buffer, m_requiredLen)
' buffer处理一下, 把已经ok的数据清掉, 只保留后面的尚未处理的数据
m_buffer = 取字节集右边 (m_buffer, 取字节集长度 (m_buffer) - m_requiredLen)
' 下一次期待包头
m_isHeader = 真
' 期待包头, 4字节
m_requiredLen = 4
' 收到了完整的数据了
返回 (ret)
.判断结束
.判断循环尾 ()
' 易语言这个 接受 , 如果指定了超时, bResult会是假, 但并不知道到底是断开还是超时.................
dataTemp = m_client.接收 (timeout, bResult)
.判断开始 (bResult)
' 收到了, 先跟之前的buffer中数据合并
m_buffer = m_buffer + dataTemp
' 当前buffer中的数据长度
m_buffLen = 取字节集长度 (m_buffer)
.默认
' 断开? 也可能是超时? .
ret = { }
跳出循环 ()
.判断结束
.判断循环尾 ()
返回 (ret) ' 返回空字节集表示连接断开
.子程序 SetMaxPacketSize, , 公开, 设置最大单次send长度, 需要与服务端一致
.参数 len, 整数型
m_maxLen = len
.子程序 SetPacketFlag, , 公开
.参数 flag, 整数型
m_flag = flag
.子程序 Send, 逻辑型, 公开
.参数 data, 字节集
.参数 timeout, 整数型, , 0 无限等待,-1 不等待 其它 具体等待时间(毫秒)。
.局部变量 头, 字节集
.局部变量 len
len = 取字节集长度 (data)
.判断开始 (len = 0 或 len > m_maxLen)
返回 (假)
.默认
.判断结束
头 = AddPacketHeader (m_flag, 取字节集长度 (data))
返回 (m_client.发送 (头 + data, timeout))
.子程序 Connect, 逻辑型, 公开
.参数 ip, 文本型
.参数 port, 整数型
返回 (m_client.连接 (ip, port))
.子程序 GetPacketFlag, 整数型, , 拆包用的, 不需要自行调用 从服务端发过来的包头中,得到包标记
.参数 数据, 字节集
.局部变量 头, 整数型
.判断开始 (取字节集长度 (数据) < 4)
' 非法数据
返回 (-1)
.默认
.判断结束
头 = 取字节集数据 (数据, 3, )
返回 (右移 (头, 22))
.子程序 GetPacketLen, 整数型, , 拆包用的, 不需要自行调用 从服务端发过来的包头中,得到包长
.参数 数据, 字节集
.局部变量 头
.判断开始 (取字节集长度 (数据) < 4)
' 非法数据
返回 (-1)
.默认
.判断结束
头 = 取字节集数据 (数据, 3, )
返回 (位与 (头, 十六进制 (“03FFFFF”)))
.子程序 AddPacketHeader, 字节集, , 封包用的, 不需要自行调用 生成包头
.参数 flag
.参数 len
.局部变量 header, 整数型
header = 位或 (左移 (flag, 22), len)
返回 (到字节集 (header))