初衷
先说一下我写这篇文章的初衷:很多时候,我需要在vmware workstation虚拟机 和 我的物理机 之间传递信息,用U盘作为载体倒来倒去太麻烦。然而,一般来说我会在所有的系统中安装python(当然用C实现更保险,但是就需要.exe和ELF两个文件)。于是,我就想自己搞了一个python脚本,方便在这种“虚拟机和物理机”以及“虚拟机之间”的文件传递。
初次尝试
服务器:接收文件
# -*- coding: cp936 -*- from socket import * import struct import os ratio_base=0.00 def print_ratio(ratio, delta=1.00): global ratio_base if ratio > ratio_base + delta: ratio_base = ratio_base + delta print " %4.2f"%ratio, print "%" else: pass if __name__ == "__main__": ADDR = ('127.0.0.1',8000) BUFSIZE = 1024 FILEINFO_SIZE=struct.calcsize('128s32sI8s') recvSock = socket(AF_INET,SOCK_STREAM) recvSock.bind(ADDR) recvSock.listen(5) conn,addr = recvSock.accept() fhead = conn.recv(FILEINFO_SIZE) filename,temp1,filesize,temp2=struct.unpack('128s32sI8s',fhead) filename = filename.strip('\00') #??? if os.path.isfile(filename): filename = raw_input("文件已存在,请起一个新名字[default: new_%s] "%filename) if filename.strip() == "": filename = 'new_'+filename.strip('\00') else: filename = filename.strip('\00') fp = open(filename,'wb') restsize = filesize while True: if restsize > BUFSIZE: filedata = conn.recv(BUFSIZE) else: filedata = conn.recv(restsize) if not filedata: break fp.write(filedata) restsize = restsize-len(filedata) ratio = ( float(filesize) - float(restsize) ) / float(filesize) * 100 print_ratio(ratio) if restsize == 0: break fp.close() conn.close() recvSock.close() print "received all"
客户端:传送文件
# -*- coding: cp936 -*- from socket import * import os import struct if __name__ == "__main__": ADDR = ('127.0.0.1',8000) BUFSIZE = 1024 FILEINFO_SIZE=struct.calcsize('128s32sI8s') filename = raw_input("file to be sent under this dir: ") #'贫民窟的百万富翁.rmvb' fhead=struct.pack('128s11I',filename,0,0,0,0,0,0,0,0,os.stat(filename).st_size,0,0) sendSock = socket(AF_INET,SOCK_STREAM) sendSock.connect(ADDR) sendSock.send(fhead) fp = open(filename,'rb') while True: filedata = fp.read(BUFSIZE) if not filedata: break sendSock.send(filedata) fp.close() sendSock.close() print "sent all"
浓缩成一个python脚本
上面代码为了简洁起见,将客户端和服务器代码分离。但是为了部署方便,下面把他们做成一个文件
file_transer.py
# -*- coding: cp936 -*- from socket import * import struct import os ratio_base=0.00 def print_ratio(ratio, delta=1.00): global ratio_base if ratio > ratio_base + delta: ratio_base = ratio_base + delta print " %4.2f"%ratio, print "%" else: pass def client_sender(): print "current directory : ", os.getcwd() #print os.listdir(os.getcwd()) server_ip = raw_input("receiver's ip : ") server_port = raw_input("receiver's port : ") ADDR = (server_ip, int(server_port) ) BUFSIZE = 1024 FILEINFO_SIZE=struct.calcsize('128s32sI8s') while True: try: filename = raw_input("file to be sent under this dir: ") #'贫民窟的百万富翁.rmvb' fhead=struct.pack('128s11I',filename,0,0,0,0,0,0,0,0,os.stat(filename).st_size,0,0) sendSock = socket(AF_INET,SOCK_STREAM) sendSock.connect(ADDR) sendSock.send(fhead) fp = open(filename,'rb') while True: filedata = fp.read(BUFSIZE) if not filedata: break sendSock.send(filedata) fp.close() print "sent" except: print "sent error" sendSock.close() def server_receiver(): print "my ip : (ipconfig / ifconfig)" server_port = raw_input("my port : ") print "waiting for file ..." ADDR = ("", int(server_port)) #note: DO NOT USE "127.0.0.1" BUFSIZE = 1024 FILEINFO_SIZE=struct.calcsize('128s32sI8s') recvSock = socket(AF_INET,SOCK_STREAM) recvSock.bind(ADDR) recvSock.listen(5) while True: try: conn,addr = recvSock.accept() fhead = conn.recv(FILEINFO_SIZE) filename,temp1,filesize,temp2=struct.unpack('128s32sI8s',fhead) filename = filename.strip('\00') #??? if os.path.isfile(filename): filename = raw_input("文件已存在,请起一个新名字[default: new_%s] "%filename) if filename.strip() == "": filename = 'new_'+filename.strip('\00') else: filename = filename.strip('\00') fp = open(filename,'wb') restsize = filesize while True: if restsize > BUFSIZE: filedata = conn.recv(BUFSIZE) else: filedata = conn.recv(restsize) if not filedata: break fp.write(filedata) restsize = restsize-len(filedata) ratio = ( float(filesize) - float(restsize) ) / float(filesize) * 100 print_ratio(ratio) if restsize == 0: break fp.close() conn.close() print filename, " received" except: print "receive error" recvSock.close() if __name__ == "__main__": choice = raw_input("send or receive [s/r] : ") if choice == "s": client_sender() print elif choice == "r": server_receiver() print else: print "oops..."
有时间再完善下
1. 目前不支持递归传递文件夹
2. 目前不是多线程传输,速度还不够快(不过因为是单机上的传输影响不大)
3. 目前只支持当前文件夹下的传输,最好允许指定路径
相关推荐
基于Python的网络传输文件功能的设计与实现.pdf
基于Python的网络传输文件功能的设计与实现
此代码用Python语言实现了服务器到客户端和客户端到服务器的文件传输。
此代码基于python实现了服务器/客户端的断点续传,可以作为网络编程中的参考。
本书第2部分将向您演示如何编写发送和接收E—的程序、提供静态和动态网页的程序、传输文件以及其他网络程序。您将学到如何使用Apach1e的mod_python模块来建立基于Web的Python应用程序。 本书后一部分侧重于Python...
【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业...计算机网络课程实验-基于Python的模拟数据链路层GBN协议源码(实现可靠文件传输).zip
python 实现文件传输 课程设计 file_transfer 包括 计算机网络课程设计 Receive File Send File Tests Test Send File 接收文件 发送文件 测试 测试发送文件
主要介绍了Python网络编程之使用TCP方式传输文件操作,结合实例形式分析了使用socket模块进行tcp协议下文件传输的原理以及服务器端、客户端相关实现技巧,需要的朋友可以参考下
HTTP大文件多线程下载工具,支持断点续传
基于python实现局域网消息发送及文件传输系统源码+GUI界面(网络课程设计).zip 基于python实现局域网消息发送及文件传输系统源码+GUI界面(网络课程设计).zip 基于python实现局域网消息发送及文件传输系统源码+GUI界面...
适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】...
即时通讯:Python实现web版多人聊天室
(此图片来源于网络,如有侵权,请联系删除! ) 答应管理员,自己挖的坑自己填... 最近刚好要做一个图片处理的小程序, 后台依然是强大无比的Python Flask, 文件上传小程序也采用multipart/form-data, 后端上无缝...
Alice有一台网络服务器,Bob又一个台式机正准备连接Alice的服务器。...网络服务器找到对应的HTML文件,把它打包成一个新的数据包发送给Bob,然后通过他的本地路由器发出去,用同样的过程传到Bob的机器上。
全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和...
tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层、数据链路层、物理层。可以说很多安全数据的传输通信都是基于tcp协议进行的。 为了让tcp通信更加方便需要引入一个socket模块(将网络层、...
python上传excel表格数据到ftp服务器
主要介绍了使用Python的Flask框架实现视频的流媒体传输,包括从摄像机获取帧到web浏览器的数字流传输,需要的朋友可以参考下
而今天我们就将利用python实现物联网下的数据传输功能。主要的内容包括:本地视频传输到服务器、视频传输到手机实时显示、以及文本传输等方式。 物联网是新一代信息技术的重要组成部分,也是"信息化"时代的重要发展...