FTP上传文件服务器python实现
总结
使用Python的socket和socketserver模块实现ftp文件服务器。不是很难,但在粘包的问题上纠缠了不少时间。解决办法是发送文件信息之后等待一段时间。
#!/usr/bin/python
#coding:utf-8
'''
ftp文件上传 服务器端
''' import socketserver
import os class myFtpServer(socketserver.BaseRequestHandler):
def setup(self):
pass def handle(self):
dir = r'F:\temp' #存放接收文件的目录 print('Connected %s:%d' %self.client_address)
while True: #持续接收文件
#接收文件的名称和大小
fileInfo = self.request.recv(1024)
if fileInfo.decode('utf-8') == 'exit':
break
filename, filesize = fileInfo.decode('utf-8').strip().split('|')
filePath = os.path.join(dir, filename) #创建文件存放路径
print('Receiving file:%s, filesize:%s'%(filename, filesize))
with open(filePath, 'wb') as f:
recvsize = 0
while True: #持续接收文件内容
if recvsize == int(filesize): #当接收的大小与文件大小相等时结束接收
break
self.data = self.request.recv(1024)
recvsize += len(self.data)
f.write(self.data)
print('upload succeed!!')
print(recvsize)
print('Disconnected %s:%d.' %self.client_address)
'''
def handle(self):
base_path = ''
conn = self.request
print( 'connected...')
while True:
pre_data = conn.recv(1024)
#获取请求方法、文件名、文件大小
file_name,file_size = pre_data.decode('utf-8').split('|') #已经接收文件的大小
recv_size = 0
#上传文件路径拼接
file_dir = os.path.join(base_path,file_name)
f = open(file_dir,'wb')
Flag = True
while Flag:
#未上传完毕,
if int(file_size)>recv_size:
#最多接收1024,可能接收的小于1024
data = conn.recv(1024)
recv_size+=len(data)
#上传完毕,则退出循环
else:
recv_size = 0
Flag = False
#写入文件
f.write(data)
print('upload successed.')
f.close()
def finish(self):
pass '''
if __name__ == '__main__':
addr = ('127.0.0.1', 9999)
sk = socketserver.ThreadingTCPServer(addr, myFtpServer)
sk.serve_forever()
#!/usr/bin/python
#coding:utf-8
'''
ftp文件上传 客户端
'''
import socket
import sys
import os
import time def ftp(address):
sk = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
sk.connect(address)
while True:
#filePath = r'C:\Users\admin\Desktop\test'
filePath = input('Input file path:')
if filePath == 'exit': #判断退出
sk.send(b'exit')
break
if not os.path.isfile(filePath): #判断是否文件
print('Not available file path...')
continue
filename = os.path.basename(filePath)
#dir = os.path.dirname(filePath) filesize = os.stat(filePath).st_size #获取文件大小
fileInfo = '%s|%s'%(filename, filesize) #重新组织文件信息,包括文件名和文件大小,用‘|’分割 #发送文件信息
sk.send(fileInfo.encode(encoding='utf-8', errors='strict'))
time.sleep(0.01) #为了防止粘包,在文件信息发送之后等待0.01秒 #持续发送文件内容
with open(filePath, 'rb') as f:
sendsize = 0
flag = True
while flag:
if sendsize + 1024 > filesize: #判断最后一份文件内容的读取
data = f.read(filesize - sendsize)
flag = False
else: #一般文件内容的读取
data = f.read(1024)
sendsize += 1024
sk.send(data) sk.close() if __name__ == '__main__':
addr = ('127.0.0.1',9999)
ftp(addr)
环境:python3.5 win10 x64
FTP上传文件服务器python实现的更多相关文章
- FTP上传下载--python
import socket import struct import json import subprocess import os class MYTCPServer: address_famil ...
- python之实现ftp上传下载代码(含错误处理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...
- python之模块ftplib(实现ftp上传下载代码)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...
- 【Python学习 】Python实现的FTP上传和下载功能
一.背景 最近公司的一些自动化操作需要使用Python来实现FTP的上传和下载功能.因此参考网上的例子,撸了一段代码来实现了该功能,下面做个记录. 二.ftplib介绍 Python中默认安装的ftp ...
- python 网络编程粘包解决方案2 + ftp上传 + socketserver
一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...
- python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...
- 在附件管理模块中增加对FTP 上传和预览的支持
在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...
- 网络编程4 网络编程之FTP上传简单示例&socketserver介绍&验证合法性连接
今日大纲: 1.FTP上传简单示例(详细代码) 2.socketserver简单示例&源码介绍 3.验证合法性连接//[秘钥加密(urandom,sendall)(注意:中文的!不能用)] 内 ...
- .net FTP上传文件
FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...
随机推荐
- thinkphp 3.2.3 - Dispatcher.class.php 解析(转发器)
class Dispatcher { public static function dispatch() { $varPath = C('VAR_PATHINFO'); // 's' $varAddo ...
- POJ 2299 Ultra-QuickSort 简单题解
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 68874 Accepted: 25813 ...
- P2920 [USACO08NOV]时间管理Time Management
P2920 [USACO08NOV]时间管理Time Management 题目描述 Ever the maturing businessman, Farmer John realizes that ...
- Android stadio
Android stadio 最近遇到大问题,就是主功能行.但是让它做库工程,他就不管用. 但是在eclipse里面就可以.
- laravel5.2总结--服务容器(依赖注入,控制反转)
1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...
- php代码审计 strcmp和MD5函数漏洞
通过get得到三个值,v1,v2,v3. if第一层判断,v1和v2得到的值不一样,但是对它们进行md5加密后的值得相等. if第二层判断,v3得到的值得和$flag的值相等,满足这两个条件输出fla ...
- 对CRC32的小结加上bugku一道题目:好多压缩包
CRC32就是校验值,一般来说不同的文件校验值不一样,所以我们可以挨个爆破,当然这是在文件比较小的时候.下面是几种情形. 1. 我新建了一个flag.txt文档,里面是我的生日20180818 然后我 ...
- 内置函数,重要的四个reduce,map,lambda,filter
#filter过滤器#filter(函数,列表)#把列表里的元素序列化,然后在函数中过滤# str=["a","b","c","d ...
- python 学习分享-实战篇增删改查作业
一大波函数来袭 作业要求: 1本次作业通过空格及逗号,将文件拆分成列表,在通过判断add.del.update.select等关键字,来判断用户执行的是哪种命令,根据不同的命令调用不同的函数去处理. ...
- python 类中__init__,__new__,__class__的使用详解
1.python中所有类默认继承object类,而object类提供了很多原始的内置属性和方法,所有用户定义的类在python 中也会继承这些内置属性.我们可以通过dir()进行查看.虽然python ...