python单线程文件传输的实例(C/S)


Posted in Python onFebruary 13, 2019

客户端代码:

#-*-encoding:utf-8-*-
 
import socket
import os
import sys
import math
import time
 
def progressbar(cur, total):
 percent = '{:.2%}'.format(float(cur) / float(total))
 sys.stdout.write('\r')
 sys.stdout.write("[%-50s] %s" % (
       '=' * int(math.floor(cur * 50 / total)),
       percent))
 sys.stdout.flush()
 
def getFileSize(file):
 file.seek(0, os.SEEK_END)
 fileLength = file.tell()
 file.seek(0, 0)
 return fileLength
 
def getFileName(fileFullPath):
 index = fileFullPath.rindex('\\')
 if index == -1:
  return fileFullPath 
 else:
  return fileFullPath[index+1:]
 
def transferFile():
 fileFullPath = r"%s" % raw_input("File path: ").strip("\"")
 if os.path.exists(fileFullPath):
  timeStart = time.clock()
  file = open(fileFullPath, 'rb')
  fileSize = getFileSize(file)
  client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  client.connect((targetHost, targetPort))
  # send file size
  client.send(str(fileSize))
  response = client.recv(1024)
  # send file name
  client.send(getFileName(fileFullPath))
  response = client.recv(1024)
  # send file content
  sentLength = 0
  while sentLength < fileSize:
   bufLen = 1024
   buf = file.read(bufLen)
   client.send(buf)
   sentLength += len(buf)
   process = int(float(sentLength) / float(fileSize) * 100)
   progressbar(process, 100)
  client.recv(1024)
  file.close()
  timeEnd = time.clock()
  print "\r\nFinished, spent %d seconds" % (timeEnd - timeStart)
 else:
  print "File doesn't exist"
 
targetHost = raw_input("Server IP Address: ")
targetPort = int(raw_input("Server port: "))
 
while True:
 transferFile()

服务器端代码:

#-*-encoding:utf-8-*-
 
import socket
import threading
import os
import sys
import math
 
bindIp = "0.0.0.0"
bindPort = 9999
 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bindIp, bindPort))
server.listen(1)
print "Listening on %s:%d" % (bindIp, bindPort)
 
def progressbar(cur, total):
 percent = '{:.2%}'.format(float(cur) / float(total))
 sys.stdout.write('\r')
 sys.stdout.write("[%-50s] %s" % (
       '=' * int(math.floor(cur * 50 / total)),
       percent))
 sys.stdout.flush()
 
def checkFileName(originalFileName):
 extensionIndex = originalFileName.rindex(".")
 name = originalFileName[:extensionIndex]
 extension = originalFileName[extensionIndex+1:]
 
 index = 1
 newNameSuffix = "(" + str(index) + ")"
 finalFileName = originalFileName
 if os.path.exists(finalFileName):
  finalFileName = name + " " + newNameSuffix + "." + extension
 while os.path.exists(finalFileName):
  index += 1
  oldSuffix = newNameSuffix
  newNameSuffix = "(" + str(index) + ")"
  finalFileName = finalFileName.replace(oldSuffix, newNameSuffix)
 return finalFileName
 
def handleClient(clientSocket):
 # receive file size
 fileSize = int(clientSocket.recv(1024))
 # print "[<==] File size received from client: %d" % fileSize
 clientSocket.send("Received")
 # receive file name
 fileName = clientSocket.recv(1024)
 # print "[<==] File name received from client: %s" % fileName
 clientSocket.send("Received")
 fileName = checkFileName(fileName)
 file = open(fileName, 'wb')
 # receive file content
 print "[==>] Saving file to %s" % fileName
 receivedLength = 0
 while receivedLength < fileSize:
  bufLen = 1024
  if fileSize - receivedLength < bufLen:
   bufLen = fileSize - receivedLength
  buf = clientSocket.recv(bufLen)
  file.write(buf)
  receivedLength += len(buf)
  process = int(float(receivedLength) / float(fileSize) * 100)
  progressbar(process, 100)
 
 file.close()
 print "\r\n[==>] File %s saved." % fileName
 clientSocket.send("Received")
 
while True:
 client, addr = server.accept()
 print "[*] Accepted connection from: %s:%d" % (addr[0], addr[1])
 
 clientHandler = threading.Thread(target=handleClient, args=(client,))
 clientHandler.start()

运行结果示例:

服务器端:

python单线程文件传输的实例(C/S)

客户端(服务器端做了端口映射:59999->9999):

python单线程文件传输的实例(C/S)

以上这篇python单线程文件传输的实例(C/S)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Web服务器框架 Tornado简介
Jul 16 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
深入解读Python解析XML的几种方式
Feb 16 Python
Python 基础之字符串string详解及实例
Apr 01 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
python selenium循环登陆网站的实现
Nov 04 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
Python 实现文件打包、上传与校验的方法
Feb 13 #Python
使用python3构建文件传输的方法
Feb 13 #Python
对python 自定义协议的方法详解
Feb 13 #Python
Python 实现两个服务器之间文件的上传方法
Feb 13 #Python
Python魔法方法详解
Feb 13 #Python
Python函数中不定长参数的写法
Feb 13 #Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 #Python
You might like
php header()函数使用说明
2008/07/10 PHP
php导入模块文件分享
2015/03/17 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
newxtree.js代码
2007/03/13 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
玩转方法:call和apply
2014/05/08 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
如何在python中判断变量的类型
2020/07/29 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
2016年公司新年寄语
2015/08/17 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
MySQL之select、distinct、limit的使用
2021/11/11 MySQL
MySQL常见优化方案汇总
2022/01/18 MySQL
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript