网络编程基础【day09】:socket解决粘包问题之MD5(八)
本节内容
1、概述
2、代码实现
一、概述
上一篇博客讲到的用MD5来校验还是用的之前解决粘包的方法,就是客户端发送一个请求,等待服务端的确认的这样的一个笨方法。下面我们用另外一种方法:就是客户端已经知道可接收多少数据了,既然客户端已经知道接收多少数据了,那么客户端在接收数据的时候,正好接收已经知道的数据,不就ok了吗?就是说我循环了正好是收到已经知道的那些数据。比如:我要发5M的数据,我正好收到5M的数据,然后就不往下再收了,因为它有可能跟MD5值黏在一块了,本来说是发5M文件,结果你发了5.1M,那么客户端正好收5M的话,那客户端的0.1M是不是就不收了,不收了之后我就把客户端把文件存下来,再来recive一下,下面recive的正好是0.1M。
二、代码实现
说明:其实我们在接收文件时,只有最后一次才会超过接收大小,所以我们从这里下手
2.1、服务端代码
说明:生成md5对象->发送的数据生成MD5值->发送MD5 值
①代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import hashlibimport socket,osserver = socket.socket()server.bind(("localhost",9999))server.listen()while True: conn,addr = server.accept() print("new conn:",addr) while True: print("等待新指令") data = conn.recv(1024) if not data: print("客户端已断开") break cmd,filename = data.decode().split() print(filename) if os.path.isfile(filename): m = hashlib.md5() #生成MD5的对象 with open(filename,"rb") as f: file_size = os.stat(filename).st_size conn.send( str(file_size).encode() ) #send file size conn.recv(1024) for line in f: m.update(line) #计算md5值 conn.send(line) #发送数据至客户端 print("file md5",m.hexdigest()) conn.send(m.hexdigest().encode()) #生成MD5值并且发送给客户端 print("send done")server.close() |
②代码改动

2.2、客户端
说明:文件大小-接收大小是否大于1024 ->获取size值->recive(size)->下面再次recive时就是MD5值了
①代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import socket,hashlibclient = socket.socket()client.connect(("localhost",9999))while True: cmd = input(">>>:").strip() if len(cmd) == 0:continue if cmd.startswith("get"): client.send(cmd.encode()) server_respose = client.recv(1024) print("server response:",server_respose) client.send("ready to recv file".encode()) file_total_size = int(server_respose.decode()) revived_size = 0 filename = cmd.split()[1] m = hashlib.md5() #生成MD5对象 with open(filename + ".new","wb") as f: while revived_size < file_total_size: if file_total_size - revived_size > 1024: #要收不止一次 size = 1024 else: #最后一次,剩多少收多少 size = file_total_size - revived_size print("last receive:",size) data = client.recv(size) revived_size += len(data) m.update(data) #计算数据接收的MD5值 f.write(data) else: print(file_total_size,revived_size) new_file_md5 = m.hexdigest() #生成接收数据的MD5值16进制形式 server_file_md5 = client.recv(1024) #接收客户端的MD5值 print("server file md5:",server_file_md5.decode()) print("client file md5:",new_file_md5)client.close() |
②代码改动

2.3、思路图

2.4、实现的效果图

网络编程基础【day09】:socket解决粘包问题之MD5(八)的更多相关文章
- Python网络编程基础 struct模块 解决黏包问题 FTP
struct模块 解决黏包问题 FTP
- python网络编程基础之socket粘包现象
粘包现象两种 登陆 #服务端import json import socket server=socket.socket()#创建socket对象 ip_port=('127.0.0.1',8001) ...
- c# socket 解决粘包,半包
处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断 ...
- Socket解决粘包问题1
粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘 ...
- 从零开始学Python第八周:网络编程基础(socket)
Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...
- python 网络编程(远程执行命令与粘包)
远程执行命令 先来学习一个新模块 , 一会用到的.. 新模块: subprocess 执行系统命令 r = subprocess.Popen('ls',shell=True,stdout=subpro ...
- 【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案
引子 现如今手游开发中网络编程是必不可少的重要一环,如果使用的是TCP协议的话,那么不可避免的就会遇见TCP粘包和拆包的问题,马三觉得haifeiWu博主的 TCP 粘包问题浅析及其解决方案 这篇博客 ...
- Socket解决粘包问题2
在AsynServer中对接收函数增加接收判断,如果收到客户端发送的请求信息,则发送10个测试包给发送端,否则继续接收,修改后的接收代码如下: private void AsynReceive() { ...
- 网络编程基础之Socket套接字
一.Socket介绍 1.什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...
随机推荐
- HTML5-Input
HTML5拥有多个新的表单输入类型,这些新特性提供了更好的输入控制和验证(有的浏览器不支持) color.date.datetime.datetime-local.email.month.number ...
- PHP——判断数组中是否有重复值并找出重复值
可以用来测试需要唯一凭据号码的,是否有重复值,不过一般直接使用uuid了,简单粗暴就解决问题,这个就简单的测试生成的数据是否有重复值吧 <?php /* * @Author: wyy * @Da ...
- HDU3966-Aragorn's Story-树链剖分-点权
很模板的树链剖分题 注意什么时候用线段树上的标号,什么时候用点的标号. #pragma comment(linker, "/STACK:102400000,102400000") ...
- Vuex以及axios
Vuex 简介 vuex是一个专门为Vue.js设计的集中式状态管理架构. 状态? 我们把它理解为在data中需要共享给其他组件使用的部分. Vuex和单纯的全局对象有以下不同: 1.Vuex 的状态 ...
- Python中matplotlib模块解析
用Matplotlib绘制二维图像的最简单方法是: 1. 导入模块 导入matplotlib的子模块 import matplotlib.pyplot as plt import numpy as ...
- HBase 清空表数据
public int clearTableByTableName(String tableName) throws Exception { logger.debug("======InitH ...
- python构建bp神经网络_鸢尾花分类(一个隐藏层)__2.代码实现
IDE:jupyter 数据集请查看:鸢尾花数据集 测试效果预览 成功率96.7% 代码已上传到码云
- HNOI2019 游记
HNOI2019 游记 Day 0 其实考前几天,心里还是挺慌的.结果最后 Day 0 的时候,因为种种原因反而释然了.也许是觉得,在这一步退役,也没有什么好害怕的吧. OI 本身就是一项偶然性太大的 ...
- 【NowCoder368E】车站(线段树)
[NowCoder368E]车站(线段树) 题面 牛客网 题解 链交的结果显然和求解的顺序无关,因此我们可以拿线段树维护区间链的链交结果. 然后怎么求解最远点. 维护链交的时候再记录两个点表示到达链交 ...
- Codeforces 1079D Barcelonian Distance(计算几何)
题目链接:Barcelonian Distance 题意:给定方格坐标,方格坐标上有两个点A,B和一条直线.规定:直线上沿直线走,否则沿方格走.求A到B的最短距离. 题解:通过直线到达的:A.B两点都 ...