py文件传输
本文参考: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文件传输的更多相关文章
- py文件的运行
安装过程及配置 安装过程准备: 下载好Python的安装程序后,开始安装,在进入安装界面后一定确保勾选将Python加入到系统环境变量的路径里.如图所示: 2 如果没有选取,那么按照下面的步骤进行操作 ...
- [源码]Python简易http服务器(内网渗透大文件传输含下载命令)
Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...
- 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...
- Python_架构、同一台电脑上两个py文件通信、两台电脑如何通信、几十台电脑如何通信、更多电脑之间的通信、库、端口号
1.架构 C/S架构(鼻祖) C:client 客户端 S:server 服务器 早期使用的一种架构,目前的各种app使用的就是这种架构,它的表现形式就是拥有专门的app. B/S架构(隶属于C/ ...
- python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)
一.玩具开机提示语 先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.2.zi ...
- FTP文件传输
FTP项目作业要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在ftp server上随意切换目 ...
- 基于序列化技术(Protobuf)的socket文件传输
好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...
- SSIS 学习之旅 FTP文件传输-脚本任务
这一章主要讲解一下用脚本怎么把CSV文件抛送到FTP服务器上 设计: 通过Demon库的Users表数据生成CSV文件. 生成后的CSV文件抛送到FTP指定目录下. 控件的使用这里就不做详细讲 ...
随机推荐
- 【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell
--------------------- 本节内容: · Spark转换 RDD操作实例 · Spark行动 RDD操作实例 · 参考资料 --------------------- 关于学习编程方 ...
- linux每日命令(13):more命令
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...
- C#中怎么判断一个数组中是否存在某个数组值
(1) 第一种方法: ,,}; ); // 这里的1就是你要查找的值 ) // 不存在 else // 存在 (2) 第二种方法: string[] strArr = {"a",& ...
- CAP原理中的一致性
CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾.因此在进行分布式架构设计时,必须做出取舍.而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值.因此设计分布式数据系统,就是在 ...
- jQuery的ID选择器失效问题
jQuery的ID选择器,在同一项目别的文件中一切正常: 在当前页面,jQuery的其它功能(如:$(document).ready(function(){ alert("ok" ...
- Nginx 基本命令
基础命令 1.启动 直接点击Nginx目录下的nginx.exe 或者 cmd运行start nginx 2.关闭 nginx -s stop 或者 nginx -s quit stop表示立即停止n ...
- 弹出框插件——dialog
基于jquery和dot.js弹出框插件,兼容IE6+等其他浏览器. 思想:弹出框元素插入body节点中,并在页面垂直居中显示(fixed定位),触发确定和关闭事件绑定. 注意ie6包含两个问题:一. ...
- Markdown 表格
表格的基本写法很简单,就跟表格的形状很相似,冒号在左边表示左对齐,右边表示右对齐,两边都有表示居中,如果都不写冒号则默认左对齐 学号|姓名|分数 :-|:-:|-: 小明|男|75 小红|女|79 小 ...
- C# 根据类名创建类的实例对象
因为我使用这个方法的类都是和AbstractScenePageDTO处于一个命名空间以及程序集下的,所以获取命名空间和程序集的时候,直接使用AbstractScenePageDTO这个类进行获取,这样 ...
- Android Studio开发第三篇版本管理Git
创建项目在前一篇讲了,这里就讲一下怎么把创建的新项目关联到远程仓库呢. 在as的菜单栏找到VCS/Import into Verson Control/Create Git Repository 弹出 ...