示例#1
0
    def send_data(cls, net_info, data, send_para={}):
        """
        向指定的网络连接发送数据

        @param {object} net_info - 要写入数据的网络信息对象(例如socket对象)
        @param {object} data - 要写入的数据对象(具体类型和定义,由实现类自定义)
        @param {dict} send_para - 写入数据的参数:
            overtime {int} - 发送超时时间,单位为毫秒, 非必须参数
        @returns {CResult} - 发送结果:
            result.code :'00000'-成功,'20404'-写入数据超时,其他为写入失败
            result.send_time : datetime 实际发送完成时间
            result.overtime : int 超时时间(毫秒),当返回结果为超时,可获取超时时间信息

        """
        # 子类必须定义该功能
        if type(send_para) != dict:
            send_para = {}
        _result = CResult('00000')
        _result.send_time = None
        _overtime = 10000
        if 'overtime' in send_para.keys():
            _overtime = send_para['overtime']
        elif hasattr(net_info, 'send_timeout'):
            # 如果net_info有超时的设置
            _overtime = net_info.send_timeout
        _result.overtime = _overtime

        _begin_time = datetime.datetime.now()

        with ExceptionTool.ignored_cresult(
            _result
        ):
            _rest_bytes = len(data)
            _total_bytes = _rest_bytes
            while _rest_bytes > 0:
                # 检查是否超时
                if (datetime.datetime.now() - _begin_time).total_seconds() * 1000 > _overtime:
                    # 已超时
                    _result.change_code(code='20404')
                    break
                with ExceptionTool.ignored(expect=(BlockingIOError)):
                    # 发送数据
                    _len = net_info.csocket.send(data[_total_bytes - _rest_bytes:])
                    if _len > 0:
                        _rest_bytes = _rest_bytes - _len

            _result.send_time = datetime.datetime.now()
        return _result
示例#2
0
    def send_data(cls, net_info, data, send_para={}):
        """
        向指定的网络连接发送数据

        @param {object} net_info - 要写入数据的网络信息对象(例如socket对象)
        @param {tuple} data - 要写入的数据对象,(proto_msg, msg)
            proto_msg : MsgHTTP报文头
            msg : 二进制数据
        @param {dict} send_para - 写入数据的参数

        @returns {CResult} - 发送结果:
            result.code :'00000'-成功,'20404'-写入数据超时,其他为写入失败
            result.send_time : datetime 实际发送完成时间

        """
        # 子类必须定义该功能
        if type(send_para) != dict:
            send_para = {}
        _result = CResult('00000')
        _result.send_time = None
        with ExceptionTool.ignored_cresult(
            _result
        ):
            # 先要更新报文头的长度
            _len = 0
            if data[1] is not None:
                _len = len(data[1])
            data[0].set_value('Content-Length', str(_len))
            _send_result = TcpIpService.send_data(net_info, data[0].to_bytes(), send_para)
            if not _send_result.is_success():
                return _send_result
            if _len > 0:
                _send_result = TcpIpService.send_data(net_info, data[1], send_para)
                _result = _send_result
        return _result