- 一、通信协议
- 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、subprocess模块:允许客户端向服务端发送一个字符串,让服务端在命令模式下运行此命令,将得到的结果返回给客户端
- 三、黏包
- 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)) #我们会得到一个元组,里面的第一个元素为我们所需要的
- 1、两种黏包情况