在上一篇文章中,我介绍了粘包的产生,以及相关的解决思路,现在这篇文章给大家介绍一下其中一种解决方法的代码详解。
关于粘包的解决思路我已经做过了简要介绍啦,就是将文件的大小一并发送到接收端,通过该文件的大小实现对文件的读取和接收。
首先可以编一个字典,将文件的大小发送到接收端,根据文件的大小设定循环语句对文件进行循环发送,直到发送完文件为止。代码形式如下:
dic={'filename':None,filesize':None}
filename=os.path.basename(file_path) #此处file_path代表的是文件所在的绝对路径
file_size=os.path.getsize(file_path) #此处file_path代表的是文件所在的绝对路径
dic['filename']=filename
dic['filesize']=file_size #这两句代码则是将字典进行赋值
str_dic=json.dumps(dic)
sk.send(str_dic.encode('utf-8')) #这两句代码既是将文件的长度信息发送到接收端
sk.recv(1024) #这两句代码则是确认收到字典,可以通过其他方法省去这一步
with open(file_path, 'rb') as file:
while file_size:
content=file.read(1024)
sk.send(content)
file_size-=len(content) #with语句下面这一部分则是循环向接收端发送文件信息
然后在接收端设定同样的接收方法,循环接收发送端发送过来的文件,直到接收完发送端发送的信息为止。代码形式如下:
str_dic=new_sk.recv(10240).decode('utf-8')
new_sk.send(b'ok') #此发送信息为校验接收到字典的信息
dic=json.loads(str_dic)
with open(filename,'ab') as file:
while dic['filesize']: #字典dic为发送端发送过来的字典
content = new_sk.recv(1024)
file.write(content)
dic['filesize']-=len(content) #此过程为对发送端循环发送的信息进行循环读写
以上就是一个简单的处理方法啦,其实还有相应的更加优化的算法值得大家去探索哦,通过上述方法,大文件的传输也能尽在掌握哦~
欢迎大家给予更多的指点和指导啦!!!