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()

猜你喜欢

转载自www.cnblogs.com/python-daxiong/p/11417759.html