目录
1.UDP
UDP不需要监听,因为udp从来都不需要建立连接,并且udp不需要检验。在一开始只能够接收数据。
包括服务端和客户端。
其中服务端:
import socket
# 1.创建udp对象
sk = socket.socket(type=socket.SOCK_DGRAM)
# 2.绑定地址和端口
sk.bind(("127.0.0.1", 9000))
while True:
# 3.udp服务器,在一开始只能够接收数据?
msg, cli_addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
print(cli_addr)
# 发送消息
msg1 = input("服务端给客户端发送的消息是?:")
sk.sendto(msg1.encode('utf-8'), cli_addr)
# 4.关闭连接
sk.close()
客户端是:
import socket
# 1. 创建udp对象
cl = socket.socket(type=socket.SOCK_DGRAM)
while 1:
# 2.发送数据 sendto(消息,(ip+port))
msg = input("客户端给服务端发送消息是?:")
cl.sendto(msg.encode('utf-8'), ("127.0.0.1", 9000))
# 接收消息
msg1, server_addr = cl.recvfrom(1024)
print(msg1.decode('utf-8'))
print(server_addr)
# 3.关闭连接
cl.close()
2.黏包是什么?
当我们执行一条特别长的命令的时候, 你会发现你拿到的不是你需要的命令结果 而是上一条的残留叫做黏包。
黏包优化算法:tcp协议在发送数据时,由于发送的字符小时,使用优化算法,把多次间隔小,或者数据量小的数据,合并成大一个数据发送给服务端。
2.1.解决黏包的方法有哪几种
- 改时间:time.sleep(0.2)
- 修改服务端字符:
把这个
data = conn.recv(1024).decode('utf-8')
data1 = conn.recv(1024).decode('utf-8')
改为:
data = conn.recv(5).decode('utf-8')
data1 = conn.recv(5).decode('utf-8')
dir:返回下面的子目录
ipconfig:返回网络配置信息
tasklist:拿到的执行程序
2.2 struck
struck:固定报头
就是一个固定的值。
打包:pack
import struct
'''
pack 是指打包,
第一个参数是指打包类型,'i'是指int类型 's'是指字符串类型。
第二次参数是指:我们要传的参数。
1024,我要进行的数据打包的大小,不管你的数据量有多大,最后都会变成固定长度的:四个字节。
'''
struct.pack('i',1024)
rest = struct.pack('i',1024)
rest1 = struct.pack('i',10240)
print(len(rest))
print(len(rest1))
解包:unpack
#解包:
import struct
'''
'''
struct.pack('i',1024)
rest = struct.pack('i',1024)
rest1 = struct.unpack('i',rest)[0]
print(rest1)
使用报头需要注意的地方:
一个是:报头要给到客户端 ,客户端才能解压这个报头
另外一个:就是一定要发送真实数据 不然客户端是拿不到的
2.3 subprocess:使用字符串执行命令
import subprocess
'''
subprocess.Popen里面有三个参数:是指当shell为True 相当于我们去启动cmd,来执行dir,
这个字符串。
如果前面的字符串是正确的就去打印: stdout=subprocess.PIPE
如果前面的字符串是错误就去打印: stderr=subprocess.PIPE
'''
obj = subprocess.Popen("dir", shell=True,
stdout=subprocess.PIPE, # 正确的结果
stderr=subprocess.PIPE # 错误的结果
)
print(obj)
# windows使用 subprocess时候 解码用'gbk'解码。
print(obj.stdout.read().decode('gbk'))
# print(obj.stderr.read().decode('gbk'))
2.4 stirp
stirp原理:去掉字符串两边的空格。
3.send和recv原理
客户端是发送消息send的,服务端是接受消息recv的。客户端发送消息是通过套接字进行的打包, 再通过网络协议进行处理, 网络协议进行跳取的时候会有一个缓冲区,到服务端后,在缓冲区进行解包,然后在服务端 recv接受。
谢谢大家请大家指导错误!