day28-黏包现象
#黏包现象:信息还没接收完,下一次接收的时候一下子接收好几条黏在一起的信息。 #黏包现象的原因:接收端不知道发送端发送的数据的长度。recv(字节数小了)。 # 第一次无法接收完就缓存起来,下一次接收。 #只有TCP才会黏包,UDP不会黏包。 #TCP的黏包现象: #server下发信息给多个client,控制它们干活。 #server端: import socket sk = socket.socket() sk.bind(('127.0.0.1',8888)) sk.listen() conn,addr = sk.accept() while True: cmd = input('>>>') if cmd == 'q': conn.send(b'q') break conn.send(cmd.encode('gbk')) #encode编码,把str转化为bytes。 ret = conn.recv(4).decode('gbk') #一次只接收4个字节,会发生黏包现象。 print(ret) conn.close() sk.close() #client端: import socket import subprocess sk = socket.socket() sk.connect(('127.0.0.1',8888)) while True: cmd = sk.recv(1024).decode('gbk') if cmd == 'q': break ret = subprocess.Popen(cmd,shell=True, #打开收到的信息。shell=True意思是执行操作系统的命令。 stdout=subprocess.PIPE,#输出结果放在PIPE管道里面 stderr=subprocess.PIPE)#输出错误放在另一个PIPE管道里面 sk.send(ret.stdout.read()) sk.send(ret.stderr.read()) sk.close()