python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)
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网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)的更多相关文章
- python实现socket上传下载文件-进度条显示
在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...
- 初级版python登录验证,上传下载文件加MD5文件校验
服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...
- python网络编程--FTP上传文件示例
1.基础版(供学习了解原理使用,low) server服务端 import socket import struct import json server = socket.socket() ip_p ...
- python实现进度条--主要用在上传下载文件
在python中进行socket上传文件的时候使用进度条,然后在网上找了好久,找寻相关的进度的条的使用,看了几个,发现总是无法进行调用,主要原因是在进行上传文件的时候,每次传送的数据量是固定的,数据的 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- python之实现ftp上传下载代码(含错误处理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...
- C#实现http协议支持上传下载文件的GET、POST请求
C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...
- 向linux服务器上传下载文件方式收集
向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...
- FTP上传下载文件(函数简易版)
FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...
随机推荐
- 【hdu4057】 恨7不成妻
http://acm.hdu.edu.cn/showproblem.php?pid=4507 (题目链接) 题意 求区间${[a,b]}$中的某些数的平方和,这些数要满足1.不是7的倍数,2.不含有7 ...
- 洛谷大宁的邀请赛~元旦祭F: U17264 photo(线段树)
标程的写法稍微有点麻烦,其实不需要平衡树也是可以做的. 线段树上维护从左端点开始最远的有拍照的长度,以及区间的最大值. 考虑两段区间合并的时候,显然左区间必须取,右区间的第一个比左区间最大值大的数开始 ...
- 解题:POI 2013 Triumphal arch
题面 二分答案,问题就转化为了一个可行性问题,因为我们不知道国王会往哪里走,所以我们要在所有他可能走到的点建造,考虑用树形DP解决(这个DP还是比较好写的,你看我这个不会DP的人都能写出来=.=) 定 ...
- Miller-Robin与二次探测
素数在数论中经常被用到.也是数论的基础之一. 人们一直在讨论的问题是,怎样快速找到素数?或者判断一个数是素数? 1.根号n枚举 原始暴力方法. 2.埃氏筛 每个合数会被筛质因子次数次.复杂度O(Nlo ...
- cloudera manager安装hive注意事项,提示连不上数据库,没有user目录权限
1.提示连不上数据库,password:null 解决方法:拷贝数据库驱动到hive的lib目录,数据库要使用安装hive机器的本地数据库,远程的可能连不上 2.没有/user目录权限 解决方法:因为 ...
- C++调Python示例(转载)
C++调Python,代码粘贴如下: #include <iostream> #include <Python.h> using namespace std; void Hel ...
- 设计模式之单例模式实现(C++)
#ifndef SINGLETON_H #define SINGLETON_H #include <cassert> #include <memory> #include &l ...
- SPOJ BALNUM Balanced Numbers (数位dp)
题目:http://www.spoj.com/problems/BALNUM/en/ 题意:找出区间[A, B]内所有奇数字出现次数为偶数,偶数字出现次数为计数的数的个数. 分析: 明显的数位dp题, ...
- Laravel 限流中间件 throttle 简析
1. 在Laravel 中配置 在 app\Http\Kernel.php 中,默认添加到中间件组 api 下,1分钟60次. 2. 限流原理 获取唯一请求来源,进行唯一标识(key) 获取该请求请求 ...
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...