在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示:

1、 服务器端代码如下:

[root@python 519]# cat server.py
#!/usr/bin/env python import time
import SocketServer HOST = '192.168.1.60'
PORT = 9999
#定义一个接收所有文件的方法,传递的参数为socket对象,文件名称和文件大小
def recv_all(socketobj,file_name,file_size):
f = open('/tmp/%s' % file_name,'w')
while file_size > 0:
if file_size <= 1024:
data = socketobj.recv(1024)
f.write(data)
break
elif file_size > 1024:
data = socketobj.recv(1024)
f.write(data)
file_size -= 1024
f.close() class MyHandler(SocketServer.BaseRequestHandler):
def handle(self):
while True:
#1.get the commands
data = self.request.recv(1024)
print data
if data.strip() == 'exit' or not data:break
options = data.strip().split(' ')
if len(options) == 2:
file_name = options[1]
if options[0] == 'put':
<span style="white-space:pre"> </span> #上传文件的时候,将文件上传到当前的路径
#2.get the file size
file_size = self.request.recv(1024)
print file_size
file_size = int(file_size)
#3.get the file content
recv_all(self.request,file_name,file_size)
self.request.sendall('DONE')
<span style="white-space:pre">		</span>#在下载文件的时候,文件到TMP目录中进行下载
elif options[0] == 'get':
f = open('/tmp/%s' % file_name)
data = f.read()
self.request.send(str(len(data)))
time.sleep(0.2)
self.request.send(data)
time.sleep(0.2)
self.request.send('DONE') s = SocketServer.ThreadingTCPServer((HOST,PORT),MyHandler)
print 'waiting for connection...'
s.serve_forever()

在进行服务端编码的时候,定义的规则是,上传文件,那么就是将文件上传到当前路径中,如果是下载文件,那么会将文件保存在/tmp目录下,并且使用传送过来的名称。

主要需要规定的是,在上传时候,先接受客户端上传命令,也就是put 和文件名,然后接收到文件的大小,再接受文件的内容,当接受完毕之后,那么会发送给客户端一个结束的信号,也就是DONE。,在进行上传的时候,客户端必须按照顺序发送相关的数据,否则可能程序无法运行。

在下载的时候,先接受客户端的下载命令,也就是get和文件名称,然后服务器端直接发送所有的文件内容,发送内容之后,发送结束done,在进行连续发送的时候,可以看到使用了time的sleep函数,主要是用来防止粘包的产生,也就是发送数据的时候,数据先到达缓冲区,可能将这次和下次的数据一次性进行了发送,从而添加了sleep方法来等待发送,没找到其他的更好的方法。

2、客户端编码如下:

[root@python 519]# cat client.py
#!/usr/bin/env python
import socket
import time
import processbar
import time HOST = '192.168.1.60'
PORT = 9999
#接收所有的数据文件,并且接收一次,写入一次,从而避免内存消耗过大,在进行接收的时候,显示进度条
def recv_all(socketobj,file_name,file_size):
f = open(file_name,'w')
while file_size > 0:
if file_size <= 1024:
processbar.progressbar(10,10)
data = socketobj.recv(1024)
f.write(data)
break
elif file_size > 1024:
processbar.progressbar(1024*10/file_size,10)
data = socketobj.recv(1024)
f.write(data)
file_size -= 1024
f.close()
s = socket.socket()
s.connect((HOST,PORT))
while True:
commands = raw_input('>>>')
if commands == 'exit' or not commands:break
s.sendall(commands)
options = commands.strip().split(' ')
if len(options) == 2:
file_name = options[1]
if options[0] == 'put':
f = open(file_name)
data = f.read()
time.sleep(0.2)
s.send(str(len(data)))
time.sleep(0.2)
s.send(data)
print s.recv(1024)
elif options[0] == 'get':
file_size = int(s.recv(1024))
recv_all(s,file_name,file_size)
print s.recv(1024)
else:
pass

在进行客户端接收的时候,如果是上传,也就是先发送命令为put和f文件名称,然后在发送文件的长度,再发送文件的内容,最后接收到服务器接收完毕的信号,也就是DOWN。

在进行下载的时候,先发送命令为get和文件名称,然后得到文件的大小,再调用方法接收所有的文件,并且显示进度条

进度条的代码可以参考上篇文章,也就是直接导入进度条的代码即可。

在进行接收文件的时候,每次接收1024个字节,然后根据循环判断剩余的文件大小,每次接收1024个字节。

在显示进度条的时候,主要就是定义的显示的进度个数为十个,从而在显示的使用的计算方式是:

size/*10file_size,从而得到上传的进度。

python实现socket上传下载文件-进度条显示的更多相关文章

  1. python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)

    ftp server 1) 读取文件名 2)检查文件是否存在 3)打开文件 4)检查文件大小 5)发送文件大小给客户端 6)等客户端确认 7)开始边读边(md5计算)发数据 8)给客户端发md5 ft ...

  2. Retrofit2文件上传下载及其进度显示

    序 前面一篇文章介绍了Retrofit2的基本使用,这篇文章接着介绍使用Retrofit2实现文件上传和文件下载,以及上传下载过程中如何实现进度的显示. 文件上传 定义接口 1 2 3 @Multip ...

  3. 初级版python登录验证,上传下载文件加MD5文件校验

    服务器端程序 import socket import json import struct import hashlib import os def md5_code(usr, pwd): ret ...

  4. C#实现http协议支持上传下载文件的GET、POST请求

    C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...

  5. FTP上传下载文件(函数简易版)

    FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...

  6. java进行文件上传,带进度条

    网上看到别人发过的一个java上传的代码,自己写了个完整的,附带源码 项目环境:jkd7.tomcat7. jar包:commons-fileupload-1.2.1.jar.commons-io-1 ...

  7. rz和sz上传下载文件工具lrzsz

    ######################### rz和sz上传下载文件工具lrzsz ####################################################### ...

  8. Ajax上传文件进度条显示

    要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...

  9. linux上很方便的上传下载文件工具rz和sz

    linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...

随机推荐

  1. 【MySQL】经典数据库SQL语句编写练习题——SQL语句扫盲

    [MySQL]数据库原理复习——SQL语言 对基本的SQL语句编写的练习题,其中的题目的答案可能会有多种书写方式. 1.题目1 1.1 关系模式 学生student:SNO:学号,SNAME:姓名,A ...

  2. C#皮肤之IrisSkin4.dll

    1. 将IrisSkin4.dll动态文件导入当前项目引用中.具体操作为:解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件,然后加 ...

  3. IOS-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 时间:2015-05-06 16:43:34      阅读:533      评论:0      收藏:0      [点我收藏+] ...

  4. 用django发送异步邮件

    太阳底下没有新鲜事,github是一个神奇的地方,你有什么想法,需求,点子.其实别人早就想到,而且也已经做到. 所以不要高估自己,有什么想法还是GITHUB一下,免得成了井底之娃. 这几天一直在研究p ...

  5. [Tomcat无法启动]'Starting Tomcat v8.0 Server at localhost' has encountered a problem.

    运行一个index.jsp,运行提示如下错误:点击服务器 解决办法1: 点击Tomcat服务器,将服务器里的web工程删除掉,再重新运行index.jsp. 解决办法2: 关闭Tomcat,最简单的方 ...

  6. react native遇到的坑

    1.模拟器报错no bundle url present https://github.com/facebook/react-native/issues/12754 http://www.cnblog ...

  7. c#实现对登陆信息的反馈,实现对网站登录密码的扫描

    最近发现我们学校的电信上网改密码的页面很简单,没有验证码,于是我就很好奇,后来发现原来是我们学校的电信的那个改密码的页面有漏洞于是就可以通过扫描账号免费上网 原理就是对修改密码的页面进行POST请求 ...

  8. secureCRT不能输入

    用secureCRT建了一个串口COM1后,连接上开发板后,可以正确接受和显示串口的输出,但是按键输入无效. 解决: Session Options -> Connection -> Se ...

  9. Python ImportError: No module named Image

    /********************************************************************************* * Python ImportEr ...

  10. Vue2.0 less全局配置

    前言 再一次vue2.0的开发中,遇到这样的一个问题,使用less与处理器,封装了一套关于项目的主题,但是使用的时候,main.js中引入后依然不能直接使用定义的@theme-bg等less定义的颜色 ...