失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【Python】网络编程--解决粘包问题--简单版:

【Python】网络编程--解决粘包问题--简单版:

时间:2021-10-09 21:11:45

相关推荐

【Python】网络编程--解决粘包问题--简单版:

网络编程–解决粘包问题–简单版:

客户端:

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】网络编程--解决粘包问题--简单版:》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。