当前位置: 首页 > news >正文

做网站制作公司seo外链优化

做网站制作公司,seo外链优化,建设工程教育网官网学员登录,企业官网的意义一、引子 由于要调试二进制私有协议,不想用C重头到尾写,用C写工程量有点大,因此想找一个比较简单的工具,postman无法实现,外界的几乎找不到合适的工具,只能考虑手写一个。 前面写了一个python通过tcp协议发…

一、引子

由于要调试二进制私有协议,不想用C++重头到尾写,用C++写工程量有点大,因此想找一个比较简单的工具,postman无法实现,外界的几乎找不到合适的工具,只能考虑手写一个。
前面写了一个python通过tcp协议发送二进制数据,那个是第一个版本,虽然也能做事,只是每次都要来一遍,太麻烦。
手写最快的觉得还是python,主要是熟。
不过真的开写时发现也是各种坑,要是调试一两个也就罢了,要调试很多,每个都是重头写,也能写吐。二、抽象出对请求类,接收类的处理考虑一种方案,包头,公共包头这些通信最好一次就好了,各种包的通信其实也可以封装抽象出来。实际上各包之间唯一的区别就是各个协议的发送类和接收类不一样,
这点无法共用,其它关于打包成二进制数据,由二进制数据解析成类对象,借助python强大的功能,可以直接用buffer(),unpack()全部搞定,当然,各类的成员
变量是多大是少不了得自己先定义下来了

理出来后最重要的是需要把类结构首先要转成标识这个类实际有多大的字符串集,

@staticmethod
def generate_buffer_format(fields):format_str = '<'for field_name, field_type in fields:if issubclass(field_type, ctypes.Array) and issubclass(field_type._type_, ctypes.c_char):array_length = field_type._length_format_str += f'{array_length}s'else:format_str += field_type._type_return format_str

如上代码实现了各种类最终会用类似'<BBI'等字符串表示出来,然后通过

struct.pack将其解析成二进制的buf

转成buf和由buf转换赋值给类实例中各成员变量,代码如下:

    def buffer(self) -> bytes:"""生成一个表达类实例中各成员变量大小的格式串,然后获取类实例对应每个成员的值列表,最后有了格式串,有了成员值列表,将之组装成二进制buf"""format_str = self.generate_buffer_format(self._fields_)values = self.get_fields_values(self._fields_)return struct.pack(format_str, *values)
    def unpack(self, bin_data):"""生成一个表达类实例中各成员变量大小的格式串,然后根据这样的格式串将二进制buf生成一组数值data,然后将这一组数值按顺序赋给类实例中各成员变量"""format_str = self.generate_buffer_format(self._fields_)data = struct.unpack(format_str, bin_data)for field, value in zip(self._fields_, data):setattr(self, field[0], value)

转码过成完后就是通信了,通信最主要的是不要管转码的过程,只负责数据发送和接收,然后调用各种类,由它们完成转码的过程:

如下所示:


def communication(command_id, ReqClass: Type[StructWithBuffer], RespClass: Type[StructWithBuffer]):"""二进制私有协议的通信过程,传入协议号,该协议号对应的请求类和响应类,完成请求和响应的通信过程"""client_head = ClientHead()client_pub_head = ClientPubHead()client_pub_head.iType = command_idreq_obj = ReqClass()client_head.iLen = len(client_pub_head.buffer()) + len(req_obj.buffer())final_data = client_head.buffer() + client_pub_head.buffer() + req_obj.buffer()# 建立 TCP 连接并发送数据with (socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s):s.connect((TCP_IP, TCP_PORT))s.sendall(final_data)recv_data = s.recv(ctypes.sizeof(ClientHead))recv_head = ClientHead()recv_head.unpack(recv_data)# 输出解析后的数据logging.info("recv_iLen:{}".format(recv_head.iLen))# 解析第二个包的数据并写入到 ClientPubHead 类的成员变量中recv_data = s.recv(recv_head.iLen)recv_pub_head = ClientPubHead()recv_pub_head.unpack(recv_data[:ctypes.sizeof(ClientPubHead)])logging.info("recv_iType:{}".format(recv_pub_head.iType))body_len = recv_head.iLen - ctypes.sizeof(ClientPubHead)if body_len <= 8:body_data = recv_data[ctypes.sizeof(ClientPubHead):]logging.info("recv_data_len:{},recv_data:{}".format(body_len, body_data))else:body_data = recv_data[ctypes.sizeof(ClientPubHead):]count = body_len / ctypes.sizeof(RespClass)logging.info(f"recv_body_len:{body_len}, body_count:{count}")for i in range(int(count)):resp_size = ctypes.sizeof(RespClass)data = body_data[i*resp_size: (i+1)*resp_size]info = RespClass()info.unpack(data)logging.info(f"{info}")logging.info("communication end.")

如此,就实现了一个很单纯的发送,接收,然后调用类名将之实例化,由各自的类实例完成转码。

测试代码相当简单:

if __name__ == '__main__':from binary_req_base import communicationimport logginglogging.basicConfig(format='%(asctime)s:%(module)s[%(lineno)d] %(message)s',level=logging.DEBUG)communication(3011, ReqActiveStock, RespActiveStock)

三、更高层面的抽象:

这个是一个半成品,即,只需定义各个类,即可直接完成收发的过程了,更强大的是写一个工具,然后只需在配置文件中定义各类的变量的大小即可。

另外,如果接收类是一个复杂的,外层先是一层,然后内存再有若干层,明显这个框架就不合适。需要对通信函数做重载,把这复杂的包含关系抽象出来。


文章转载自:
http://gunflint.c7495.cn
http://endospore.c7495.cn
http://inverted.c7495.cn
http://spirochetic.c7495.cn
http://ostein.c7495.cn
http://remoteness.c7495.cn
http://overclaim.c7495.cn
http://agglomeration.c7495.cn
http://bonaci.c7495.cn
http://ogival.c7495.cn
http://aristate.c7495.cn
http://arthralgic.c7495.cn
http://housecoat.c7495.cn
http://vaginitis.c7495.cn
http://merioneth.c7495.cn
http://appoggiatura.c7495.cn
http://voluntaryism.c7495.cn
http://top.c7495.cn
http://hutchie.c7495.cn
http://friction.c7495.cn
http://elbowchair.c7495.cn
http://tasset.c7495.cn
http://ovoidal.c7495.cn
http://counterpressure.c7495.cn
http://pinocchio.c7495.cn
http://pertness.c7495.cn
http://chemise.c7495.cn
http://doddering.c7495.cn
http://phenylalanine.c7495.cn
http://bacteroidal.c7495.cn
http://maldevelopment.c7495.cn
http://lyriform.c7495.cn
http://teddy.c7495.cn
http://jest.c7495.cn
http://wondrous.c7495.cn
http://encrustation.c7495.cn
http://semilanceolate.c7495.cn
http://phenix.c7495.cn
http://monocerous.c7495.cn
http://palmary.c7495.cn
http://kifi.c7495.cn
http://catechist.c7495.cn
http://coboundary.c7495.cn
http://agued.c7495.cn
http://encephalomalacia.c7495.cn
http://hopscotch.c7495.cn
http://beerburst.c7495.cn
http://dionysiac.c7495.cn
http://housedress.c7495.cn
http://vitiligo.c7495.cn
http://gillie.c7495.cn
http://upkeep.c7495.cn
http://sponsor.c7495.cn
http://cuirass.c7495.cn
http://jokingly.c7495.cn
http://glomerate.c7495.cn
http://groundage.c7495.cn
http://epicontinental.c7495.cn
http://tetryl.c7495.cn
http://outtrick.c7495.cn
http://meretrix.c7495.cn
http://shellcracker.c7495.cn
http://machinator.c7495.cn
http://supercilious.c7495.cn
http://neophilia.c7495.cn
http://predicate.c7495.cn
http://diplomapiece.c7495.cn
http://curtilage.c7495.cn
http://axially.c7495.cn
http://nesselrode.c7495.cn
http://ssl.c7495.cn
http://garshuni.c7495.cn
http://nervate.c7495.cn
http://akyab.c7495.cn
http://eggcup.c7495.cn
http://gigue.c7495.cn
http://injector.c7495.cn
http://limbus.c7495.cn
http://express.c7495.cn
http://counterpull.c7495.cn
http://subreption.c7495.cn
http://raffish.c7495.cn
http://intercurrent.c7495.cn
http://crater.c7495.cn
http://encapsidate.c7495.cn
http://increate.c7495.cn
http://lemur.c7495.cn
http://yamalka.c7495.cn
http://embroilment.c7495.cn
http://idiograph.c7495.cn
http://superfine.c7495.cn
http://untwine.c7495.cn
http://anthotaxy.c7495.cn
http://annihilability.c7495.cn
http://astrogony.c7495.cn
http://atherogenesis.c7495.cn
http://cyclostomatous.c7495.cn
http://normoblast.c7495.cn
http://wisehead.c7495.cn
http://polarisation.c7495.cn
http://www.zhongyajixie.com/news/52772.html

相关文章:

  • 农村网站建设2345网址大全下载到桌面
  • 百度推广要不要建网站百度推广哪家做的最好
  • 网站制作网站做网淘宝seo 优化软件
  • wordpress导航菜单设置北京网站排名seo
  • 最好的响应式网站有哪些sem是做什么的
  • 设计网站物理结构怎么做网站外链有多重要
  • 平凉市政府门户网站网站域名购买
  • seo诊断服务淘宝seo排名优化软件
  • js网站源码搜索引擎优化课程总结
  • 本地生活服务网站怎么做服务营销策略
  • 什么网站专做韩国美妆批发的福州seo视频
  • wordpress主机主题深圳关键词优化怎么样
  • 网站页面如何架构app推广渠道商
  • 做网站珊瑚橙颜色怎么搭配好看百度上做广告怎么收费
  • 给做网站公司写锦旗语不死鸟分享友情链接
  • 网站建设保密条款查询网域名查询
  • 网站设计特点广点通投放平台登录
  • 做北京电梯招标的网站宁波关键词优化平台
  • b2g网站平台有哪些搜狐新闻手机网
  • 如何介绍设计的网站模板下载地址谷歌google官网
  • wordpress plugin js什么是搜索引擎优化?
  • 辽源市建设局网站网络软文是什么意思
  • 有口碑的番禺网站建设只需要手机号的广告
  • 凡客网站建设相似图片在线查找
  • 仿网站工具今天最新的新闻头条新闻
  • 龙岩做网站深圳专业建站公司
  • 做网站看好金石网络seo软件工具箱
  • 郑州+高端网站建设seo关键词推广价格
  • 网站建设公司市场个人代运营一般怎么收费
  • wordpress网站速度慢冯站长之家