`

python 网络(二、传输文件)

 
阅读更多

初衷

       先说一下我写这篇文章的初衷:很多时候,我需要在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的网络传输文件功能的设计与实现.zip

    在IT行业中,网络传输文件是一项基础且重要的任务,尤其在分布式系统、云计算和大数据处理等领域。本项目聚焦于使用Python语言来设计和实现这一功能,它涵盖了网络编程、文件操作和可能的数据压缩等方面的知识点。...

    基于Python的网络传输文件功能的设计与实现.pdf

    根据提供的文件信息,我们可以了解到《基于Python的网络传输文件功能的设计与实现》一文所涉及的关键知识点。 首先,Python作为一种程序设计语言,其流行的主要原因在于其简单易学的语法以及代码的简洁性。Python的...

    python:socket传输大文件示例

    - 对于大文件传输,可以考虑分块传输,或者使用断点续传机制,提高传输效率和可靠性。 10. **客户端代码**: - 客户端打开文件,获取文件信息,然后连接到服务器,发送文件名和大小,接着发送文件数据。 以上...

    python实现文件传输

    在Python编程领域,网络通信和文件传输是两个重要的主题。Python提供了丰富的库,如socket,使得开发者能够轻松地实现这两个功能。在这个项目中,我们利用Python的socket库来构建一个简单的文件传输系统,包括服务器...

    PYTHON使用socket传输文件

    我们将深入探讨如何使用Python的socket库来传输文件。 首先,让我们从服务器端开始。在`server.py`中,我们需要创建一个socket对象,通常用`socket.socket()`函数完成。这个对象会监听指定的IP地址和端口号,等待...

    python实现断文件点续传

    断点续传是一种允许用户在中断网络传输后从上次中断的位置继续传输的技术,对于大文件的上传和下载尤其有用。 本示例中,"c_f.py"和"s_f.py"分别代表客户端和服务器端的代码文件。这两个文件协同工作,实现了基于...

    Python 实现局域网内文件共享功能

    在大作业中,你可能会遇到的问题包括网络连接异常处理、文件传输的进度显示、错误恢复机制等。这些问题可以通过异常处理结构(如`try-except`)和适当的用户反馈来解决。 总的来说,Python的`socets`模块为实现...

    基于Python的网络传输文件功能的设计与实现.docx

    论文的第二章详细讲解了网络传输文件的基本概念,包括TCP/IP协议栈在网络传输中的作用,以及Python中用于网络通信的库,如socket库和asyncio库,它们提供了低级别的网络通信接口,可以用来创建自定义的文件传输协议...

    python socket局域网聊天与文件传输.zip

    描述中提到"python socket局域网聊天文件传输程序",这表明这个项目是一个用Python语言编写的、利用socket库实现的网络应用程序,它的功能包括局域网内的文字聊天和文件分享。"界面用wxPython编写"揭示了该程序的...

    python网络编程基础

    Python网络编程基础是入门Python网络应用开发的重要领域,它涵盖了从基本的网络概念到复杂的网络交互技术。在Python中,网络编程主要涉及TCP/IP协议、HTTP协议、套接字编程、Web服务API调用等多个方面。下面将详细...

    python文件传输demo

    Python的`io`模块提供了一种基于流的IO模型,如`BytesIO`和`StringIO`,它们可以在内存中处理文件,这对于小文件传输或在网络传输中避免临时文件很有用。 4. **FTP(File Transfer Protocol)**: FTP是一种标准...

    Python-HTTP大文件多线程下载工具支持断点续传

    总结来说,"Python-HTTP大文件多线程下载工具支持断点续传"是一个结合了HTTP通信、多线程编程和文件操作的实例,对于提升Python网络编程能力,尤其是处理大文件下载问题,具有很高的学习价值。通过深入研究和实践,...

    利用python进行大文件的传输

    在IT行业中,大文件传输是一项常见的任务,尤其是在分布式系统、云计算和网络编程中。Python作为一门强大而灵活的编程语言,提供了多种处理大文件传输的方法。本教程将聚焦于使用Python通过Socket进行大文件的传输,...

    python 使用socket传输图片视频等文件的实现方式

    在Python中,使用socket模块实现文件传输是一个基础且实用的技能。本文将详细介绍在Python环境下,如何使用socket传输包括图片和视频在内的各种文件。文章内容涵盖了服务器端和客户端的代码实现,以及文件处理的相关...

    python写的简易文件浏览器

    这个应用程序利用了Python的网络库和异步I/O框架,如asynio,来实现高效的数据传输。 首先,我们来了解一下Python在网络编程中的应用。Python提供了许多库来处理网络通信,如socket、http.server、http.client等。...

    Python网络编程基础

    本书第2部分将向您演示如何编写发送和接收E—的程序、提供静态和动态网页的程序、传输文件以及其他网络程序。您将学到如何使用Apach1e的mod_python模块来建立基于Web的Python应用程序。 本书后一部分侧重于Python...

    Python网络编程基础第二版 源代码

    Python网络编程基础第二版的源代码是一份宝贵的教育资源,它涵盖了Python在进行网络通信和数据交换方面的核心概念和技术。这份源代码提供了丰富的示例和练习,帮助初学者深入理解网络编程的基本原理。以下是对这份...

    python 远程获取文件

    在Python编程中,远程获取文件是一项常见的任务,它涉及到网络通信和文件操作。这个主题主要涵盖了两个关键领域:网络编程和文件I/O。下面将详细解释如何使用Python来实现这一功能,以及涉及到的相关知识点。 首先...

    网络备份 网络上传 python

    网络备份是指将本地数据通过网络传输到远程服务器或另一台设备上,以防止数据丢失或损坏。这种备份方式可以提供异地冗余,增加数据安全性。Python中常用的库如`paramiko`、`scp`和`rsync`(Python实现)等,可以方便...

Global site tag (gtag.js) - Google Analytics