• 一、通信协议
    • 1、TCP协议:在收发信息时需要先建立“三次握手”,即尝试收发信息三次,这是为了保证收发的稳定性与可靠性,但是此举会导致效率过低,http便是基于TCP协议做的
    • 2、UDP协议:接受的时候会指定ip,效率很高,但不稳定,可能会丢包,QQ就是基于UDP协议做的
  • 二、模拟ssh
    • 1、subprocess模块:允许客户端向服务端发送一个字符串,让服务端在命令模式下运行此命令,将得到的结果返回给客户端
      import subprocess
      res=subprocess.Popen("dir",
                          shell=True,
                          stderr=subprocess.PIPE,
                          stdout=subprocess.PIPE)
      print(res.stdout.read().decode())      #window则选择gbk的解码方式,linux和mac选择UTF-8的解码方式
      

       

  • 三、黏包
    • 1、两种黏包情况
      • 1、一种便是字节数过长,一次性发送数据超过最大字节数,故而需要分批发送,第二次发送的是第一次的剩余
      • 2、第二种便是两次发送间隔过短,在接受时当成一个数据包接收
    • 2、黏包的解决办法
      • 1、对于第一种黏包情况,我们可以循环取值,知道将一个数据包全部取光,具体操作方法便是提前将需发送的数据长度发给接收端,接受端通过此接收端操作循环次数来接收数据
      • 2、对于第二种黏包现象,我们也有几种处理情况:
        • 1、一是可以认为设置的阻塞,目的就是为了人为设置一个发送的时间间隔,不让数据被一次性被接收,比较便捷的方法便是引入struct模块
        • 2、struct模块,该模块的目标就是将int类型固定压包成四个字节,我们在获得数据后,将前四个字节的数据切出后便可以方便的完成黏包的分离工作。
          import struct
          hp=struct.pack("i",1231423423)    #压包,可以将整数型数字压成长度为4的字节类型
          print(hp,len(hp))
          i=struct.unpack("i",hp)            #反压包,可以将被压包的类型还原,但是得到的不是数字
          print(i,type(i))                    #我们会得到一个元组,里面的第一个元素为我们所需要的
          

           

posted on 2018-09-04 19:24  哈尔斯塔特  阅读(137)  评论(0编辑  收藏  举报