python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)
2017-06-17 19:43
609 查看
ftp server
1) 读取文件名
2)检查文件是否存在
3)打开文件
4)检查文件大小
5)发送文件大小给客户端
6)等客户端确认
7)开始边读边(md5计算)发数据
8)给客户端发md5
ftp下载文件 服务器 # -*- coding:utf-8 -*- __author__ = 'shisanjun' import socket import os import hashlib server=socket.socket() server.bind(("127.0.0.1",9999)) server.listen(5) while True: print("等待新指令") conn,addr=server.accept() print("连接信息",addr) while True: try: data=conn.recv(1024) except ConnectionResetError as e: print(e) if not data: #客户端断开会传个空值过来,会导致进入死循环 print("客户端断开连接") break cmd,filename=data.decode("utf-8").split() print(filename) if os.path.isfile(filename): f=open(filename,'rb') m=hashlib.md5() #MD5验证 file_size=os.stat(filename).st_size #获取文件大小 conn.send(str(file_size).encode()) #给客户端发送文件大小 conn.recv(1024) #阻塞 因为有两次send,防止出现“粘包” for line in f: m.update(line) conn.send(line) else: f.close() print("file md5 ",m.hexdigest()) print("send done") conn.send(m.hexdigest().encode()) #给客户端发送md5验证值 server.close()
客户端 # -*- coding:utf-8 -*- __author__ = 'shisanjun' import os import socket import hashlib client=socket.socket() client.connect(("127.0.0.1",9999)) while True: cmd=input(">>:").strip() if len(cmd)==0:continue if cmd.startswith("get"): client.send(cmd.encode("utf-8")) #给服务器端发送命令 response=client.recv(1024) #接受服务器相应:文件大小 total_file_size=int(response.decode("utf-8")) client.send(b"read to recv file") #防止粘包,阻塞 f=open(cmd.split()[1],'wb') m=hashlib.md5() #md5验证 recv_size=0 while recv_size<total_file_size: if total_file_size - recv_size>1024: #判断最后一次接受数据,长度是多少,就收多少,如果还是1024有可能会出现粘包 size=1024 else: size=total_file_size - recv_size recv_data=client.recv(size) f.write(recv_data) m.update(recv_data) recv_size+=len(recv_data) #要以len来计算,最后一次的数据不一定是1024 else: f.close() recv_md5=m.hexdigest() recv_server_md5=client.recv(1024).decode() print("md5 clinet and server", recv_md5,recv_server_md5)
上传文件
客户端 # -*- coding:utf-8 -*- __author__ = 'shisanjun' import socket import json import os host=("127.0.0.1",9000) client=socket.socket() client.connect(host) while True: cmd_str=input("请输入命令>>").strip() if len(cmd_str)==0:continue cmd_list=cmd_str.split() if cmd_list[0]=="put": if len(cmd_list)==1: print("not find put filename") else: filename=cmd_list[1] if os.path.isfile(filename): file_obj=open(filename,'rb') filename2=filename.split("/")[-1] print(filename2) data_stat="%s %s" %(filename2,os.path.getsize(filename)) data={ "filename":filename2, "filesize":os.path.getsize(filename) } client.send(json.dumps(data).encode("utf-8")) for line in file_obj: client.send(line) file_obj.close() else: print("can not find file") elif cmd_list[0]=="get": pass 服务器端 # -*- coding:utf-8 -*- __author__ = 'shisanjun' import socket import json host=("127.0.0.1",9000) server=socket.socket() server.bind(host) server.listen(5) while True: conn,addr=server.accept() data=conn.recv(4096) print(data.decode("utf-8")) data_dict=json.loads(data.decode("utf-8")) filename=data_dict.get("filename") f=open(filename,"wb") recesize=0 while recesize<data_dict.get("filesize"): recefile=conn.recv(4096) f.write(recefile) recesize+=len(recefile) f.close()
相关文章推荐
- Python基础学习(5)网络编程socket、文件上传、粘包问题、socketserver、IO多路复用、线程与进程、进程池、线程池、上下文管理、协程
- Python网络编程之基于socket实现文件上传
- Python -- 网络编程 -- Socket发送文件
- 网络编程:上传文件, * 需求:客户端需定义输入流读取客户端本地磁盘中的数据,使用getOutputStream给服务端发送数据。 * 服务端需要定义输出流,将文件数据保存到服务端的本地磁盘中。
- Android网络编程之Socket方式上传对象序列化文件(客户端)
- Android网络编程之Socket方式上传对象序列化文件(服务器端)
- Python:FTP上传和下载文件编程
- iOS 网络编程 socket 发送数据
- python socket 实现远程执行命令 上传 下载文件
- python网络编程之文件下载实例分析
- python读取串口、网络编程、文本处理与文件操作
- 网络编程之get,post请求,文件上传及下载
- Python网络编程:初探nltk与美汤结合处理网络数据
- Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天
- Reachability 网络编程总结(解析数据,下载文件,确认网络环境)
- Python 网络编程起步(Socket发送消息)
- Java网络编程实践和总结 --- 基于TCP的Socket编程之实现文件上传和下载服务
- java网络编程____httpURLConnection上传下载文件
- Python的Socket知识3:socketserver实现多并发、文件上传下载
- python2.7和python3.4网络编程处理二进制数据区别