本文参考:http://blog.163.com/kongdelu2009@yeah/blog/static/1119952072009102562126194/

发送端程序:

# -*- coding: utf8 -*-

import struct

import logging.handlers  

import sys;

from socket import *

import os;

import string;

LOG_FILE = 'send.log'

//通过log模块将日志输出到文件当中

handler = logging.handlers.RotatingFileHandler(LOG_FILE,mode = 'w', maxBytes = 1024*1024, backupCount = 5) # 实例化handler   

fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(message)s'  

formatter = logging.Formatter(fmt)   # 实例化formatter  

handler.setFormatter(formatter)      # 为handler添加formatter  

logger = logging.getLogger('Send.log')    # 获取名为tst的logger  

logger.addHandler(handler)           # 为logger添加handler  

logger.setLevel(logging.DEBUG)  

//增加handle,将日志输出到控制台

console = logging.StreamHandler()  

console.setLevel(logging.DEBUG)  

# 设置日志打印格式  

console.setFormatter(formatter)  

logger.addHandler(console)

//命令行参数处理

iArgLen = len(sys.argv);

if iArgLen < 4:

    logger.debug('command arg is not enough')

    sys.exit(0);

#网络地址

addrString = sys.argv[1];

logger.debug('addrString = ' + addrString);

#必须使用fullPath

filename = sys.argv[2];

logger.debug('filename = ' + filename);

path,fName=os.path.split(filename);  

#文件传输过去的存储地址

# ServerSaveAddr = sys.argv[3];

# ServerSaveAddr = "%s\\%s"%(ServerSaveAddr,fName);

# logger.debug('ServerSaveAddr = %s'%(ServerSaveAddr));

#版本号

version = sys.argv[3];

logger.debug('version = %s'%(version));

#map类型  0-DB 1- OB

iType = int(sys.argv[4]);

logger.debug('iType = %d'%(iType));

ADDR = (addrString,5454);

BUFSIZE = 1024

FILEINFO_SIZE=struct.calcsize('128s11I')

logger.debug('fineinfo_size = %d'%(FILEINFO_SIZE));

sendSock = socket(AF_INET,SOCK_STREAM)

#try:

sendSock.connect(ADDR)

version = version.encode('utf-8');

iLen = len(version);

logger.debug('versin string Len = %d'%(iLen));

//序列号相关信息至内存

fhead=struct.pack('128s11I',version,iType,iLen,0,0,0,0,0,0,os.stat(filename).st_size,0,0)

logger.debug("fheadsize %d" %(len(fhead)));

logger.debug("filesize %d" %(os.stat(filename).st_size));

ret = sendSock.send(fhead)

logger.debug('head send success ,size = %d'%(ret));

fp = open(filename,'rb')

while 1:

    filedata = fp.read(BUFSIZE)

    if not filedata: break

    ret = sendSock.send(filedata);

    #logger.debug('file send  ,size = %d'%(ret));

    

logger.debug('file send success');

fp.close();

sendSock.close();

##except:

#    print('An exception happened ,clear and exit');

#    if  'fp' in locals().keys() :

#        fp.close();

#sendSock.close();

logger.debug('Aplication End');

//接受端程序

# -*- coding: utf8 -*-

from socket import *

import os

import struct

import sys

import time;

import logging  

import logging.handlers  

 

LOG_FILE = 'Recv.log'  

handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes = 1024*1024, backupCount = 5) # ʵ��handler   

fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(message)s'  

  

formatter = logging.Formatter(fmt)   # ʵ��formatter  

handler.setFormatter(formatter)      # Ϊhandler���formatter  

  

logger = logging.getLogger('Recv.log')    # ��ȡ��Ϊtst��logger  

logger.addHandler(handler)           # Ϊlogger���handler  

logger.setLevel(logging.DEBUG)  

console = logging.StreamHandler()  

console.setLevel(logging.DEBUG)  

console.setFormatter(formatter)  

logger.addHandler(console)

iArgLen = len(sys.argv);

if iArgLen < 2:

    logger.debug('command arg is not enough')

    sys.exit(0);

addrString = sys.argv[1];

logger.debug('addrString = ' + addrString);

ADDR = ('',5454);

logger.debug(ADDR);

BUFSIZE = 1024

FILEINFO_SIZE=struct.calcsize('128s11I')

logger.debug('fineinfo_size = %d'%(FILEINFO_SIZE));

recvSock = socket(AF_INET,SOCK_STREAM)

recvSock.bind(ADDR)

recvSock.listen(True)

logger.debug("wait for connect\r\n");

bTimeOut = False;

fileSize = 0;

//接受相关数据,需要进行超时处理

while 1:

    conn,addr = recvSock.accept()

    logger.debug("-------------------connect success------------------- ");

    fhead = conn.recv(FILEINFO_SIZE)
    fEnterClock = time.clock();

    bTimeOut = False;

    while 1:

        iLen = len(fhead);

        if iLen != 0:

            if iLen != FILEINFO_SIZE:

                logging.debug('The Recive headLen(%d) is not fit(%d)'%(iLen,FILEINFO_SIZE))

                sys.exit(0);  

        else:

            if time.clock() - fEnterClock > 3:

                bTimeOut = True;

                break;

            continue;

        logger.debug('fheadsize = %d'%(len(fhead)));

        version,iType,iLen,temp3,temp4,temp5,temp6,temp7,temp8,fileSize,temp10,temp11=struct.unpack('128s11I',fhead)

        logger.debug('fliesize %d'%(fileSize));

        break;

    if bTimeOut == True:

        logger.debug('This Connect TimeOut');

        conn.close();

        continue;

    logger.debug("file head receive success ");

    

    version = version.decode('utf-8');

    version = version[0:iLen];

    logger.debug("version   = %s "%(version));

    

    filename = '%s.1zip'%(version);

    

    logger.debug("filename = %s"%(filename));

    

    filename = filename.strip('\00') #...

    

    fp = open(filename,'wb')

    

    restsize = fileSize

    

    logger.debug("begin receice file, filesize = %d"%(fileSize));

    

    while 1:

    

        if restsize > BUFSIZE:

    

            filedata = conn.recv(BUFSIZE)

    

        else:

    

            filedata = conn.recv(restsize)

    

        if not filedata: break

    

        fp.write(filedata)

    

        restsize = restsize-len(filedata)

    

        if restsize == 0:

    

                break

    

    logger.debug('file receive success');

    

    fp.close()

    conn.close()

    

    # save the version number

    fVersion = open('version.txt','w');

    fVersion.write(version);

    fVersion.close();

    logger.debug('save version success');

    # save the position number

    fPos = open('CopyPostion.txt','w');

    strType = ('%d'%(iType));

    fPos.write(strType);

    fPos.close();

    logger.debug('save copyPostion success');

    # open the copy bat command

    os.system('test.bat');

    

recvSock.close()

logger.debug('socket close');

总结:

1、try/except/finally;

2、 if  'fp' in locals().keys() : 判断本地变量是否存在

3、dic = dic(), list = [], str()

py文件传输的更多相关文章

  1. py文件的运行

    安装过程及配置 安装过程准备: 下载好Python的安装程序后,开始安装,在进入安装界面后一定确保勾选将Python加入到系统环境变量的路径里.如图所示: 2 如果没有选取,那么按照下面的步骤进行操作 ...

  2. [源码]Python简易http服务器(内网渗透大文件传输含下载命令)

    Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...

  3. 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天

    由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...

  4. Python_架构、同一台电脑上两个py文件通信、两台电脑如何通信、几十台电脑如何通信、更多电脑之间的通信、库、端口号

    1.架构 C/S架构(鼻祖) C:client  客户端 S:server  服务器 早期使用的一种架构,目前的各种app使用的就是这种架构,它的表现形式就是拥有专门的app. B/S架构(隶属于C/ ...

  5. python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验

    一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...

  6. python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)

    一.玩具开机提示语 先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.2.zi ...

  7. FTP文件传输

    FTP项目作业要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在ftp server上随意切换目 ...

  8. 基于序列化技术(Protobuf)的socket文件传输

    好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...

  9. SSIS 学习之旅 FTP文件传输-脚本任务

    这一章主要讲解一下用脚本怎么把CSV文件抛送到FTP服务器上 设计:   通过Demon库的Users表数据生成CSV文件.   生成后的CSV文件抛送到FTP指定目录下. 控件的使用这里就不做详细讲 ...

随机推荐

  1. Socket网络编程--小小网盘程序(1)

    这个系列是准备讲基于Linux Socket进行文件传输.简单的文件传输就是客户端可以上传文件,可以从服务器端下载文件.就这么两个功能如果再加上身份验证,就成了FTP服务器了,如果对用户的操作再加上一 ...

  2. 《CLR via C#》读书笔记 之 线程基础

    第二十五章 线程基础 2014-06-28 25.1 Windows为什么要支持线程 25.2 线程开销 25.3 停止疯狂 25.6 CLR线程和Windows线程 25.7 使用专用线程执行异步的 ...

  3. Django登陆以后重定向到请求登陆的页面

    登陆和注销操作在网页编程上很常见,这两个操作经常需要在操作成功以后转入发出请求的页面. 比如用户正在浏览一篇文章,发现下载该文章的附件需要登录才能进行,这时候点击登陆链接转入登陆页面,输入用户名密码登 ...

  4. WebMisSharp,WebMisCentral,企业框架正则表达式规则共享专版

    ElegantWM.WebUI/Application/common/src/Tools.js 欢迎大家贡献更多的正则验证规则,目前支持如下: /*************************** ...

  5. 使用grep查找字符串

    如下: grep -r 'target string' --exclude='pattern' dir/ 例子: grep -r Debug --exclude='*.js' ./ 查找本目录下除了j ...

  6. jQuery表格列宽可变,兼容firfox

    本demo使用jQuery包,实现表格列宽可拖拽功能,并实现页面reset时的重新布局.使用jQuery,方便函数的调用,给要处理的表格添加id 后,直接调用$("#id").mo ...

  7. printf打印输出null问题的跟踪

    最近在工作中,遇到一处 printf输出有null的情况,在此记录一下,问题分析的过程. 测试代码很简单,本机为64位操作系统: #include <stdio.h> #include & ...

  8. android 软键盘自动弹出和关闭

     一.布局中软键盘自动弹出 bargain_dialog_offer_edit.requestFocus(); bargain_dialog_offer_edit.setFocusable(true) ...

  9. traff.sh

    #!/bin/bash #网络监控 while [ "1" ] do eth=$1 RXpre=$(cat /proc/net/dev | grep $eth | tr : &qu ...

  10. 工具 - vConsole调试工具 在项目中的应用

    最近做移动端项目比较多,电脑上开发完了上真机必现问题,但是真机上又看不了代码很捉急啊有没有. 这两天才发现这个腾讯良品vConsole,以前开发小程序见过,但没想到他竟然还能被应用到我们的h5页面中, ...