网络编程–解决粘包问题–简单版:
客户端:
import structimport socketphone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.connect(('127.0.0.1',9909))while True:# 1:发命令cmd=input('>>:').strip()#dirif not cmd:continuephone.send(cmd.encode('utf-8'))# 2:拿命令的结果,并打印#第一步:先收报头header=phone.recv(4)# 第二步:从报头中解析出来对真实数据的描述信息(数据的长度)total_size=struct.unpack('i',header)[0]#第三步:接收真实的数据recv_size=0recv_data=b''#循环接收数据,直到接收完全部数据跳出循环while recv_size <total_size:res=phone.recv(1024)recv_data+=res#为了查看接收数据recv_size+=len(res)#数据长度计算print(recv_data.decode('utf-8'))phone.close()
服务端:
import socketimport subprocessimport structphone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind(('127.0.0.1',9909))phone.listen(5)print('starting..')while True:#链接循环conn,client_addr=phone.accept()print(client_addr)while True:try:#1:收命令cmd=conn.recv(8096)if not cmd:break#适用于linux操作系统# 2:执行命令,拿到结果# subprocess.Popen通过它可以来创建进程,并与其进行复杂的交互# cmd:标准像子进程传入需要执行的shell命令,如:ls - al## subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。## subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。obj=subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)stdout=obj.stdout.read()stderr=obj.stderr.read()# 3:把命令的结果返回给客户端# 第一步:制作固定长度的报头total_size=len(stdout)+len(stderr)header=struct.pack('i',total_size)# 第二步:把报头发送给客户端conn.send(header)# 第三步:在发送真实的数据conn.send(stdout)conn.send(stdout)# 适用于Windows操作系统except ConnectionResetError:breakconn.close()phone.close()
1:先启动服务端,在从客户端传入数据:
服务端:
客户端:
:
2:传入数据后,在客户端输入命令或者数据:
客户端:
服务端:
如果觉得《【Python】网络编程--解决粘包问题--简单版:》对你有帮助,请点赞、收藏,并留下你的观点哦!