Hp-socket_TcpPack同步-易语言类模块

.版本 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))

 

分享到:
赞(1)